MSSQL: только последняя запись в GROUP BY (с идентификатором) - PullRequest
6 голосов
/ 27 сентября 2010

Отслеживание / копирование вопроса о компутомах , но с добавлением некоторых поворотов ...

У меня есть следующая таблица в MSSQL2008

id | business_key | result | date
1 | 1 | 0 | 9
2 | 1 | 1 | 8
3 | 2 | 1 | 7
4 | 3 | n | 6
5 | 4 | 1 | 5
6 | 4 | 0 | 4

А теперь я хочу сгруппировать на основе business_key, возвращающего полную запись с самой новой датой. Итак, мой ожидаемый результат:

id | business_key | result | date
1 | 1 | 0 | 9
3 | 2 | 1 | 7
4 | 3 | n | 6
5 | 4 | 1 | 5

Бьюсь об заклад, что есть способ достичь этого, я просто не могу найти / увидеть / подумать об этом в данный момент.

редактировать: извините за это, я действительно имел в виду что-то еще из первоначального вопроса, который я сделал. Я чувствовал, что редактировать это может быть лучше, чем принять решение и задать другой вопрос. Моя первоначальная проблема заключалась в том, что я не фильтрую по идентификатору.

Ответы [ 5 ]

15 голосов
/ 27 сентября 2010
SELECT t.*
FROM
(
    SELECT *, ROW_NUMBER() OVER
              (
                  PARTITION BY [business_key]
                  ORDER BY [date] DESC
              ) AS [RowNum]
    FROM yourTable
) AS t
WHERE t.[RowNum] = 1
3 голосов
/ 27 сентября 2010
SELECT 
       *
FROM 
       mytable 
WHERE 
       ID IN (SELECT MAX(ID) FROM mytable GROUP BY business_key)
2 голосов
/ 27 сентября 2010

Если предположить, что комбинация business_key & date уникальна ....

Рабочий пример (3-й раз - это брелок):

declare @src as table(id int, business_key int,result int,[date] int)
insert into @src
SELECT 1,1,0,9
UNION SELECT 2,1,1,8
UNION SELECT 3,2,1,7
UNION SELECT 4,3,1,6
UNION SELECT 5,4,1,5
UNION SELECT 6,4,0,4

;with bkdate(business_key,[date])
AS
(
    select business_key,MAX([date])
    from @src 
    group by business_key
)
select src.* from @src src 
inner join bkdate
ON src.[date] = bkdate.date
and src.business_key = bkdate.business_key
order by id
2 голосов
/ 27 сентября 2010
SELECT 
     MAX(T1.id) AS [id],
     T1.business_key, 
     T1.result 
FROM 
     dbo.My_Table T1 
LEFT OUTER JOIN dbo.My_Table T2 ON 
     T2.business_key = T1.business_key AND 
     T2.id > T1.id 
WHERE 
     T2.id IS NULL 
GROUP BY T1.business_key, 
     T1.result 
ORDER BY MAX(T1.id)

Отредактировано на основе уточнений

SELECT M1.*
FROM My_Table M1
INNER JOIN 
(
    SELECT [business_key], MAX([date]) as MaxDate
    FROM My_Table 
    GROUP BY [business_key]
) M2 ON M1.business_key = M2.business_key AND M1.[date] = M2.MaxDate
ORDER BY M1.[id]
2 голосов
/ 27 сентября 2010

Как насчет (отредактировано после изменения вопроса):

with latestdate as (
  select business_key, maxdate=max(date)
  from the_table
  group by business_key
), latest as (
  select ID = max(id)
  from the_table
    inner join latestdate
     on the_table.business_key=latestdate.business_key
       and the_table.date=latestdate.maxdate
  group by the_table.business_key
)
select the_table.*
from the_table
  inner join latest
    on latest.id=the_table.id
...