Выберите отличное от usercolumn и минимальное значение даты для каждого поля в usercolumn - PullRequest
6 голосов
/ 20 июня 2009

У меня есть такие данные, но более 1500000 записей и более 700 пользователей:

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      ,    datecolumn \        
a1              ,    1998/2/11\
a2              ,    1998/2/8\
a3              ,    1998/7/7\
a4              ,    1998/4/14\
a5              ,    1998/2/11\
....

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

Ответы [ 6 ]

25 голосов
/ 20 июня 2009
SELECT usercolumn, MIN(datecolumn) FROM tablename GROUP BY usercolumn;

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

2 голосов
/ 20 июня 2009

Это будет работать для 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

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

0 голосов
/ 21 августа 2009

ВЫБЕРИТЕ РАЗЛИЧНОЕ ИМЯ ПОЛЬЗОВАТЕЛЯ, ДАТА ОТ TABLENAME КАК A WHERE A.DATE = (ВЫБЕРИТЕ МИН. (ДАТА) ИЗ TABLENAME WHERE USERNAME = A.USERNAME)

0 голосов
/ 20 июня 2009

Вы можете попробовать это:

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 голосов
/ 20 июня 2009

Если у вас есть больше, чем просто эти два столбца, лучший 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

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

0 голосов
/ 20 июня 2009

Что-то вроде этого должно сделать галочку

    SELECT usercolumn
         , MIN(datecolumn)
      FROM YouTable
     GROUP BY usercolumn
         , MIN(datecolumn)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...