Tsql - 使用max和group by获取整行信息

时间:2010-08-13 20:15:38

标签: sql sql-server tsql group-by grouping

我有一张表,其中包含以下列:

PK1   PK2   ID   DATE    Value  flag

我的计算涉及获取每个ID的最大值。

  select id,
         max(value) 
    from table 
group by id

我想在我正在使用的行上标记该标志。如果id和max(value)对应多行,则标记具有最大日期的行。如果它们具有相同的id,则max(value)和max(date)只标记其中一行(不关心那一行)

有什么想法吗?

谢谢!

3 个答案:

答案 0 :(得分:10)

对于SQL2005 +可能是这样的。 (假设“Mark”表示更新标志列)

WITH cte AS
(
SELECT PK1, PK2, ID, DATE, Value, flag,
ROW_NUMBER() OVER (PARTITION BY id ORDER BY value desc, date desc) AS RN
FROM table 
)
UPDATE cte
SET flag=CASE WHEN RN=1 THEN 1 ELSE 0 END

答案 1 :(得分:5)

使用SQL Server 2005或更高版本,您可以执行以下操作:

SELECT x.*
FROM (
 SELECT *,
        ROW_NUMBER() OVER (PARTITION BY id ORDER BY value DESC, date DESC) AS RN
 FROM table
) x
WHERE x.RN = 1

答案 2 :(得分:1)

为什么这不起作用?

update table
set flag = '1'
where id in (select id from (SELECT PK1, PK2, id, date,value, 
        ROW_NUMBER() OVER (PARTITION BY id ORDER BY value DESC, date DESC) AS RN 
FROM table) t where RN = 1)

编辑:以下语句将起作用如果您不想(或某些sql版本中不能)使用cte

上述说法不起作用,因为正如马丁在下面所说,id仍在列表中。

然而,如果有人不喜欢使用cte,下面的内容会有效。(虽然不像马丁的解决方案那么优雅)

update table
set flag = '1'
where convert(varchar,PK1)+convert(varchar,PK2) in (select convert(varchar,PK1)+convert(varchar,PK2) from (SELECT PK1, PK2, id, date,value, 
        ROW_NUMBER() OVER (PARTITION BY id ORDER BY value DESC, date DESC) AS RN 
FROM table) t where RN = 1)