[英]How to select the equivalent row for another column of the max(column) in group by in SQL Server
我需要在下面的Sql中进行更改,以使CreatedOn返回Max(Value)的选定记录。 你可以观察- todo线 。
应该返回:2015年2月1日和2015年8月1日 ,你可以在查询结果看,但马克斯(CreatedOn)将选择最大,而不是最大(值)所指的记录。
SQL
SET DATEFIRST 1
SELECT
CONCAT(DATEPART(YEAR, CreatedOn),DATEPART(WEEK, CreatedOn)) Week,
MAX(CreatedOn) CreatedOn, -- todo: this should return 2/01/2015 and 8/01/2015
MAX(Value) AS MaxValue
FROM Table1
GROUP BY CONCAT(DATEPART(YEAR, CreatedOn),DATEPART(WEEK, CreatedOn))
表格1:
╔════╦═══════════╦═══════╗
║ Id ║ CreatedOn ║ Value ║
╠════╬═══════════╬═══════╣
║ 1 ║ 1/01/2015 ║ 1 ║
║ 2 ║ 2/01/2015 ║ 2 ║
║ 3 ║ 8/01/2015 ║ 4 ║
║ 4 ║ 9/01/2015 ║ 2 ║
╚════╩═══════════╩═══════╝
查询结果:
╔════════╦═══════════╦══════════╗
║ Week ║ CreatedOn ║ MaxValue ║
╠════════╬═══════════╬══════════╣
║ 2015 1 ║ 2/01/2015 ║ 2 ║
║ 2015 2 ║ 8/01/2015 ║ 4 ║
╚════════╩═══════════╩══════════╝
*编辑 :我需要返回2015年8月1日,因为它是MaxValue(4)的对应行。
您可以在每周的分区( PARTITION BY Week
)上使用ROW_NUMBER()
,按降序值( ORDER BY Value DESC
)排序,以便在一周内对每个记录进行“排名”。 选择每周中具有最高值的行然后是每个分区中排名最高的行( WHERE Rnk = 1
)。 我使用CTE来防止重复周计算。
WITH Weeks AS
(
SELECT CONCAT(DATEPART(YEAR, CreatedOn),DATEPART(WEEK, CreatedOn)) Week,
Id, CreatedOn, Value
FROM Table1
),
Ranked As
(
SELECT Week, CreatedOn, Value,
ROW_NUMBER() OVER (PARTITION BY Week ORDER BY Value DESC) Rnk
FROM Weeks
)
SELECT Week, CreatedOn, Value
FROM Ranked
WHERE Rnk = 1;
您的查询是正确的,但日期格式存在问题。 您正在读取日期为dd / mm / yyyy,而DB将其解释为mm / dd / yyyy。
所以快速解决方法是,在插入值时使用正确的格式
insert into Table1 ( id , CreatedOn, value)
values (1 , '01/01/2015' , 1 )
insert into Table1 ( id , CreatedOn, value)
values (2 , '01/02/2015' , 2 )
insert into Table1 ( id , CreatedOn, value)
values (3 , '01/09/2015' , 4 )
insert into Table1 ( id , CreatedOn, value)
values (4 , '01/08/2015' , 2)
我试过这个工作。 如果您需要SQLFiddle,请告诉我。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.