Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何为SQL Server中group by中max(列)的另一列选择等效行_Sql_Sql Server_Tsql - Fatal编程技术网

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

如何为SQL Server中group by中max(列)的另一列选择等效行,sql,sql-server,tsql,Sql,Sql Server,Tsql,我需要在下面的Sql中进行更改,以使CreatedOn返回MaxValue的所选记录。您可以观察-todo线 应返回:2015年1月2日和2015年1月8日,如查询结果所示, 但是MaxCreatedOn将选择max而不是referent记录 最大值的 Sql 表1: 查询结果: *编辑:我需要返回8/01/2015,因为它是MaxValue 4的对应行 您可以在每周分区的分区上使用行_编号,按降序值顺序按值DESC排序,以便在一周内对每条记录进行“排序”。选择每周值最高的行就是每个分区中排名最

我需要在下面的Sql中进行更改,以使CreatedOn返回MaxValue的所选记录。您可以观察-todo线

应返回:2015年1月2日和2015年1月8日,如查询结果所示, 但是MaxCreatedOn将选择max而不是referent记录 最大值的

Sql

表1:

查询结果:

*编辑:我需要返回8/01/2015,因为它是MaxValue 4的对应行

您可以在每周分区的分区上使用行_编号,按降序值顺序按值DESC排序,以便在一周内对每条记录进行“排序”。选择每周值最高的行就是每个分区中排名最靠前的行,其中Rnk=1。我已经使用CTEs来防止重复本周的计算

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)

我试过这个。如果您需要相同的SQLFIDLE,请告诉我。

字符串中日期的解释取决于连接的日期格式。例如,请参见。最不可知的字符串格式是YYYYMMDD,虽然yyyy mm dd通常足够好。我不知道是否每个人都理解我需要什么,但我注意到它可能会让人困惑。。。我之所以需要2015年1月9日,只是因为max 4的对应日期为2015年1月9日,而不是因为9是max日期。这是每个人都理解的吗?@RogerOliveira我相信你在寻找groupwise最大值-不幸的是,在你的样本数据中,每周的最大日期也有最大值,这意味着你最初在CreatedOn ad value上独立应用的最大值也应该巧合地起作用?@StuartLC是的,我的错,我做了一个错误的样本数据,我可以改变它,如果有必要。。。但我需要的是,事实上,对应的CreatedOn来自maxvalue的行@RogerOliveira,数据证明返回在一周中具有最高值的一天创建的,即使它不是该周的最后一天。没错!这是令人印象深刻的,我真的很感激,你是一个传奇,再次拯救了我的一天@斯图尔特
╔════════╦═══════════╦══════════╗
║  Week  ║ CreatedOn ║ MaxValue ║
╠════════╬═══════════╬══════════╣
║ 2015 1 ║ 2/01/2015 ║        2 ║
║ 2015 2 ║ 8/01/2015 ║        4 ║
╚════════╩═══════════╩══════════╝
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;
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)