如何找到与列的最小值/最大值相关联的行?

josh0798

所以基本上我有一些简单的 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 列指定最小值和最大值与哪一个相关联。

阿里·莫萨维

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

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 的记录键,这也很简单,我们将添加一个身份列作为 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

希望这可以帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在与另一列中的特定ID相关联的一列中找到最小值和最大值

找到最小值+最大值和关联的列

如何找到数据帧或矩阵的最小值/最大值的位置(行/列)(R问题)

如何找到所有數據框的最大值、最小值[不是按列和行的值]

如何找到最大值和最小值

找到每列的最大值和最小值,然后找到每一行的最大值和最小值

numpy:通过关联从关联中找到最小值和最大值

如何找到每一行的最大值和最小值

MySQL如何在求和一列后找到最大值和最小值

如何为选定的列选择一行中的最大值和最小值

如何使用 awk 计算多列(按行)的最大值和最小值

如何计算特定行的列的最小值和最大值?

选择一列的最小值,另一列的最大值以及与最大值相关的字段

如何从表中找到最大值和最小值以及另一列值?

如何在R的一列中的值序列内找到最大值和最小值?

找到最大值后,在单独的列中找到后续的最小值

熊猫找到当地的最大值和最小值

在熊猫中找到班级的最小值(或最大值)

在for循环中找到最大值/最小值

从元素列表中找到最大值/最小值

如何在单个值的许多行中找到最小值和最大值

如何在pd.DataFrame的另一列中找到满足条件的行之间的最大值和最小值?

如何从 R 中跨多个数据帧的公共列中找到最大值/最小值

在与另一列对应的列中找到最大值和最小值

按 3 列分组并根据第 4 列找到最大值/最小值?

R根据另一行找到每个组的最小值和最大值

awk:在列中找到最小值和最大值

在两列中找到最小值和最大值

找到第3列的最小值和最大值,然后打印整行