Применить Distinct и TOP (1) вместе - PullRequest
0 голосов
/ 16 марта 2012

Моя таблица базы данных выглядит примерно так:

#tblMain
ID     Value  CreatedDate
________________________________________
1      25     2011-10-11 14:00:45.910
1      20     2011-10-26 14:00:12.910
2      27     2011-10-14 14:00:32.910
2      39     2011-10-14 14:00:28.910
2      54     2011-10-17 14:00:27.910
3      67     2011-10-25 14:00:16.910
3      79     2011-10-25 14:00:02.910
4      34     2011-10-26 14:00:14.910
4      24     2011-10-26 14:00:06.910
4      88     2011-10-26 14:00:47.910
5      12     2011-10-26 14:03:14.910
5      34     2011-10-26 14:04:06.910
5      55     2011-10-26 14:04:47.910

Я получу список идентификаторов из другой таблицы. Итак, теперь я хочу присоединить приведенную выше таблицу к этой таблице на основе идентификатора таким образом, чтобы я получал 1 строку для каждого отдельного идентификатора с полем значения из строки с MIN (CreatedDate), т.е. самым старым значением для этого конкретного идентификатора , то есть для каждой строки выбранная строка будет:

SELECT TOP(1) * from #tblMain ORDER BY CreatedDate ASC where ID = 1

SELECT TOP(1) * from #tblMain ORDER BY CreatedDate ASC where ID = 2...and so on.

Таким образом, мой вывод должен быть таким:

ID  Value  CreatedDate               X   Y   Z(other columns from other tables)
_______________________________________________________________________________
1   25     2011-10-11 14:00:45.910
2   39     2011-10-14 14:00:28.910
3   79     2011-10-25 14:00:02.910
4   24     2011-10-26 14:00:06.910
5   12     2011-10-26 14:03:14.910

Поверьте мне, я изо всех сил старался представить свои требования настолько четко, насколько это возможно, но если что-то неясно, дайте мне знать. Ожидая быстрого ответа. Благодаря.

Ответы [ 3 ]

5 голосов
/ 16 марта 2012

Попробуйте:

select m.ID, m.Value, m.CreatedDate, o.x, o.y, o.z
from (select tM.*, row_number() over (partition by ID order by CreatedDate) rn
      from #tblMain tM) m
left join otherTable o on m.ID = o.ID
where m.rn=1
1 голос
/ 16 марта 2012
SELECT T1.ID,T1.Value,T1.CreateDate, T2Col1,..
FROM T2 INNER JOIN 
   (
     SELECT ID,Value,CreateDate,
         Row_Number() OVER (ORDER BY CreateDate) AS R1,
         Rank() OVER (ORDER BY CreateDate) AS R2
     FROM #tblMain
   ) T1 ON T2.ID = T1.ID
WHERE T1.R1 = T1.R2
0 голосов
/ 16 марта 2012
select
    Main.ID
    ,Main.Value
    ,Main.CreateDate
    ,MyOtherTable.X
    ,MyOtherTable.Y
    ,MyOtherTable.Z
from
    #tblMain Main
    inner join --this sub-query returns the unique ids with the min create dates
        (select
            ID
            ,MIN(CreateDate) as CreateDate
        from
            #tblMain
        group by
            ID) MinDates
        on MinDates.CreateDate = Main.CreateDate
            and MinDates.ID = Main.ID
    left join MyOtherTable
        on MyOtherTable.ID = Main.ID
...