【问题标题】:How to find the row associated with the min/max of a column?如何找到与列的最小值/最大值关联的行?
【发布时间】:2019-08-06 12:04:22
【问题描述】:

所以基本上我有一些简单的 SQL 代码,如下所示;

SELECT 
       [Column1]
      ,[Column2]
      ,[Column3]
      ,[Column4]
      ,MIN([Column5]) AS maxColumn5
      ,MAX([Column6]) AS minColumn6
      ,SUM([Column7]) AS sumColumn7
      ,SUM([Column8]) AS sumColumn8
      ,SUM([Column9]) AS sumColumn9

FROM 
    [tableName]

GROUP BY 
        [Column1]
       ,[Column2]
       ,[Column3]
       ,[Column4]

我要做的也是找到与 MIN([Column6]) 对应的列“Column1”、“Column2”或“Column3”,然后找到与 MAX([Column8]) 对应的列.

输出应该完全一样,除了最后会有一个额外的 2 列指定最小值和最大值与哪一个相关联。

【问题讨论】:

  • 只是 HAVING Column1 = MIN([Column6]) AND Column1 = MAX([Column8]) 不工作?
  • 您的列标签不正确,请更新 MIN([Column5]) AS minColumn5 not max,加上 MAX([Column6]) AS maxColumn6 not min.

标签: sql tsql


【解决方案1】:

我认为您的问题存在一个简单的问题,因为对应于最大值或最小值的 Col1、Col2、Col3 直接显示,换句话说,您在按 Col1、Col2、Col3 和 Col4 分组时拥有它们. 由于您没有提供一些数据,我将设置一些随机数据来证明我的观点。 让我们创建一个类似于您的 9 列的内存表,并用 col6-8 的随机数据填充它,例如 10 行,您可以使用以下内容:-

Declare @data Table(
Column1 int,Column2 int,Column3 int,Column4 int,Column5 int,Column6 int,Column7 int,Column8 int,Column9 int
)
declare @index int=5
while(@index>0)
begin
    insert into @data values(1,2,3,4,RAND()*1000,RAND()*1000,RAND()*1000,RAND()*1000,RAND()*1000)
    insert into @data values(5,6,7,8,RAND()*1000,RAND()*1000,RAND()*1000,RAND()*1000,RAND()*1000)
    set @index=@index-1
end

我们可以看到下面的数据

select * from @data  order BY [Column1],[Column2],[Column3],[Column4]

Column1 Column2 Column3 Column4 Column5 Column6 Column7 Column8 Column9
1   2   3   4   669 203 278 364 577
1   2   3   4   389 316 290 548 661
1   2   3   4   835 555 942 985 604
1   2   3   4   477 743 580 305 414
1   2   3   4   431 296 471 150 352
1   2   3   4   346 220 573 941 633
1   2   3   4   392 450 652 978 883
1   2   3   4   235 479 751 136 978
1   2   3   4   906 183 141 915 783
1   2   3   4   329 342 682 977 870
5   6   7   8   218 740 41  299 816
5   6   7   8   800 630 674 888 799
5   6   7   8   27  307 446 743 345
5   6   7   8   501 928 824 592 691
5   6   7   8   439 624 260 757 547
5   6   7   8   287 610 287 708 652
5   6   7   8   441 711 433 642 343
5   6   7   8   751 928 237 53  535
5   6   7   8   594 768 708 173 33
5   6   7   8   352 703 943 867 661

现在让我们看看您提供的分组结果,没有任何更改

Col1    Col2    Col3    Col4    minCol5 maxCol6 maxCol8 sumCol7 sumCol8 sumCol9
  1      2       3       4        235   743      985     5360    6299    6755
  5      6       7       8        27    928      888     4853    5722    5422

所以如果我们回到您的问题,maxCol6 的 Col1、Col2、Col3 的值是多少,对于每个 maxCol6,您都有 Col1、Col2、Col3 甚至 Col4 的值。 那么 maxCol16 的 Col1、Col2、Col3 的值是 928,它们是 5,6 和 7。

好的,现在假设您想要具有 maxCol6 的记录键,这也很简单,我们将添加一个标识 col 作为 ID,如下所示:-

Declare @data Table(
ID int identity(1,1), Column1 int,Column2 int,Column3 int,Column4 int,Column5 int,Column6 int,Column7 int,Column8 int,Column9 int
)
declare @index int=10
while(@index>0)
begin
    insert into @data values(1,2,3,4,RAND()*1000,RAND()*1000,RAND()*1000,RAND()*1000,RAND()*1000)
    insert into @data values(5,6,7,8,RAND()*1000,RAND()*1000,RAND()*1000,RAND()*1000,RAND()*1000)
    set @index=@index-1
end
select * from @data  order BY [Column1],[Column2],[Column3],[Column4]

;with agg as (
    SELECT 
           [Column1]
          ,[Column2]
          ,[Column3]
          ,[Column4]
          ,MIN([Column5]) AS minColumn5
          ,MAX([Column6]) AS maxColumn6
          ,MAX([Column8]) AS maxColumn8
          ,SUM([Column7]) AS sumColumn7
          ,SUM([Column8]) AS sumColumn8
          ,SUM([Column9]) AS sumColumn9
    FROM 
       @data [tableName]
    GROUP BY 
            [Column1]
           ,[Column2]
           ,[Column3]
           ,[Column4]

)
--select * from agg order BY [Column1],[Column2],[Column3],[Column4]
select agg.*,maxCol6.ID [MaxCol6Seq],maxCol8.ID [MaxCol8Seq]  from agg 
    inner join @data maxCol6
        on      agg.Column1=maxCol6.Column1 
            and agg.Column2=maxCol6.Column2
            and agg.Column3=maxCol6.Column3 
            and agg.Column4=maxCol6.Column4 
            and agg.maxColumn6=maxCol6.Column6
    inner join @data maxCol8
        on      agg.Column1=maxCol8.Column1 
            and agg.Column2=maxCol8.Column2
            and agg.Column3=maxCol8.Column3 
            and agg.Column4=maxCol8.Column4 
            and agg.maxColumn8=maxCol8.Column8

由于这是这组数据的新运行,如下:-

ID  Column1 Column2 Column3 Column4 Column5 Column6 Column7 Column8 Column9
1   1   2   3   4   201 848 993 50  304
3   1   2   3   4   497 207 644 399 104
5   1   2   3   4   445 321 822 151 185
7   1   2   3   4   611 402 620 61  543
9   1   2   3   4   460 409 182 915 211
11  1   2   3   4   886 804 180 213 282
13  1   2   3   4   614 709 932 806 162
15  1   2   3   4   795 752 110 474 463
17  1   2   3   4   737 545 77  648 727
19  1   2   3   4   788 862 266 464 851
20  5   6   7   8   218 561 943 572 54
18  5   6   7   8   741 621 610 214 536
16  5   6   7   8   579 248 374 693 761
14  5   6   7   8   866 415 198 528 657
12  5   6   7   8   905 947 500 50  387
10  5   6   7   8   492 860 948 299 220
8   5   6   7   8   861 328 727 40  327
6   5   6   7   8   435 534 707 769 777
4   5   6   7   8   587 68  45  184 614
2   5   6   7   8   189 24  289 121 772

结果如下:-

C1  C2  C3  C4  minC5   maxC6   maxC8   sumC7   sumC8   sumC9   MaxCol6Seq  MaxCol8Seq
1   2   3   4   201      862    915      4826   4181    3832    19           9
5   6   7   8   189      947    769      5341   3470    5105    12           6

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    如果您只想在每一行上设置一个标志来指定该值是总体最大值还是最小值,您可以使用窗口函数和CASE

    SELECT [Column1], [Column2], [Column3], [Column4],
           MAX([Column5]) AS maxColumn5,
           MIN([Column6]) AS minColumn6,
           SUM([Column7]) AS sumColumn7,
           SUM([Column8]) AS sumColumn8,
           SUM([Column9]) AS sumColumn9,
           (CASE WHEN MIN([Column6]) = MIN(MIN([Column6])) OVER () THEN 1 ELSE 0 END) as is_min_column6,
           (CASE WHEN MAX([Column7]) = MAX(MAX([Column7])) OVER () THEN 1 ELSE 0 END) as is_max_column7
    FROM [tableName]
    GROUP BY [Column1], [Column2], [Column3], [Column4]
    

    【讨论】:

    • 嗨,我试过你的方法,但没用将该行号链接回原始表。
    • @josh0798 。 . . “没用”没有帮助。您应该编辑您的问题并提供示例数据和所需的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    • 1970-01-01
    • 2020-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多