我有一张表,其中包含以下列:
PK1 PK2 ID DATE Value flag
我的计算涉及获取每个ID的最大值。
select id,
max(value)
from table
group by id
我想在我正在使用的行上标记该标志。如果id和max(value)对应多行,则标记具有最大日期的行。如果它们具有相同的id,则max(value)和max(date)只标记其中一行(不关心那一行)
有什么想法吗?
谢谢!
答案 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)