2009-06-20 8 views
6

У меня есть некоторые данные, как это, но больше, чем 1500000 записей и более чем 700 пользователей:Выберите отличие от usercolumn и минимального значения даты для каждого поля в usercolumn

usercolumn ,  datecolumn\  
a1   ,  1998/2/11\ 
a2   ,  1998/3/11\ 
a1   ,  1998/2/15\ 
a4   ,  1998/4/14\ 
a3   ,  1999/1/15\ 
a2   ,  1998/11/12\ 
a2   ,  1999/2/11\ 
a3   ,  2000/2/9\ 
a1   ,  1998/6/5\ 
a3   ,  1998/7/7\ 
a1   ,  1998/3/11\ 
a5   ,  1998/3/18\ 
a2   ,  1998/2/8\ 
a1   ,  1998/12/11\ 
a4   ,  1998/12/1\ 
a5   ,  1998/2/11\ 
.... 

Я хотел бы иметь различные данные usercolumn и минимальное значение даты для каждого пользователя, как это:

usercolumn  , datecolumn \   
a1    , 1998/2/11\ 
a2    , 1998/2/8\ 
a3    , 1998/7/7\ 
a4    , 1998/4/14\ 
a5    , 1998/2/11\ 
.... 

, пожалуйста, помогите мне, чтобы написать команду SQL, чтобы сделать это для OLEDB адаптера в C#, спасибо.

+0

@ Ответ dmitri (однажды исправленный в соответствии с моим комментарием) подходит для проблемы, о которой вы заявляете, но я подозреваю, что вы неправильно задали проблему: в частности, если у вас есть другие столбцы, вам нужно другой подход. –

ответ

0

Нечто подобное должно сделать клеща

SELECT usercolumn 
     , MIN(datecolumn) 
     FROM YouTable 
    GROUP BY usercolumn 
     , MIN(datecolumn) 
+0

«Ошибка SQL: агрегатные функции не допускаются в предложении GROUP BY» (по крайней мере, из приличных SQL-модулей!). Просто удалите последнюю строку, группировка по min (datecolumn) не имеет смысла, и ответ в порядке без нее! -) –

+0

Извините. Просто mistypes.Thanks для исправления. –

0

Если у вас есть больше, чем просто эти две колонки, лучше SQL использовать, зависит немного о том, что сервер у вас есть на другом конце этого OLEDB адаптера, но вот что-то, что будет хорошо работать со многими (увы, не все!) таких возможных серверов:

SELECT t.* 
FROM thetable t 
LEFT JOIN thetable taux 
    ON(t.usercolumn=taux.usercolumn 
    AND t.datecolumn>taux.datecolumn) 
WHERE taux.usecolumn IS NULL 

, который вы могли бы читать как «испускают те строки таблицы, с такими, что не существует никакой другой строки таблицы с того же пользователя и строго меньше даты ». Если минимальная дата для данного пользователя может возникать несколько раз, это даст столько строк для этого пользователя - если это проблема для вас, есть и решения для этого ... но я буду ждать, пока вы уточните свой вопрос больше, прежде чем я больше работать на этом -)

2

Это будет работать для SQLServer 2008 и DB2:

with temp as (
    select *, row_number() over (partition by usercolumn order by datecolumn) as rownum 
    from table) 
select * from temp 
where rownum = 1 

Это даст правильные результаты, даже если вам необходимо включить несколько столбцов в избранных.

20
SELECT usercolumn, MIN(datecolumn) FROM tablename GROUP BY usercolumn; 

Обратите внимание, что если вы хотите использовать другие столбцы, они должны либо отображаться в предложении GROUP BY, либо быть постоянными по строкам. В противном случае результат будет недетерминированным.

+0

+1 Простой и правильный ответ – gbn

+0

работал для меня, thx – 5er

+0

наконец, после поиска часов. благодаря –

0

вы могли бы попробовать это:

SELECT DISTINCT a.username, a.date 
FROM tablename AS a INNER JOIN tablename AS b 
ON(a.username = b.username AND a.date < b.date) 

Что касается C#, косяк помочь вам там

0

SELECT DISTINCT USERNAME, ДАТУ ИЗ TABLENAME КАК ГДЕ A.DATE = (SELECT MIN (ДАТА) FROM TABLENAME WHERE USERNAME = A.USERNAME)