繁体   English   中英

如何在SQL Server中为group by中的max(列)的另一列选择等效行

[英]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;

SqlFiddle在这里

您的查询是正确的,但日期格式存在问题。 您正在读取日期为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM