【问题标题】:how to select max of two columns and group it by station如何选择最多两列并按站分组
【发布时间】:2019-03-03 21:12:20
【问题描述】:

我有一个像这样的简单表格

 station    num     tim
   1        150    10
   1       200     222
   1       100     5000
   1       200     555
   2       100     500
   2       120     200
   3        1      2

想要的输出是这样的

station num     tim
   1    200     555
   2    120     200
   3    1       2

我写了这段代码,但是 station=1 和 num=200 返回两行

(SELECT a.station , a.num ,a.tim
FROM test.dbo.tst a
JOIN (
SELECT station, MAX(num) num
FROM test.dbo.tst
GROUP BY station
) b ON a.station = b.station and a.num=b.num ) order by station 

【问题讨论】:

    标签: sql sql-server tsql select two-columns


    【解决方案1】:

    一种可能的方法是使用ROW_NUMBER() 对按station 分组并按numtim 降序排列的行进行编号,然后选择编号等于1 的行。

    输入:

    CREATE TABLE #Stations (
       station int,
       num int,
       tim int
    )
    INSERT INTO #Stations
       (station, num, tim)
    VALUES
       (1, 150, 10),
       (1, 200, 222),
       (1, 100, 5000),
       (1, 200, 555),
       (2, 100, 500),
       (2, 120, 200),
       (3, 1,   2)
    

    声明:

    ;WITH cte AS (   
       SELECT 
          station, 
          num, 
          tim,
          ROW_NUMBER() OVER (PARTITION BY station ORDER BY num DESC, tim DESC) AS Rn
       FROM #Stations
    )
    SELECT 
       station, 
       num, 
       tim
    FROM cte
    WHERE Rn = 1
    

    输出:

    station num tim
    1       200 555
    2       120 200
    3       1   2
    

    【讨论】:

    • 使用 Window 函数比使用 2 个 GROUP BY 子句更好,我会提到另一种可能的方法,但你会得到我的支持 +1
    • 另外我更新了我的答案并提到如果他不知道的话,通知 OP 不要接受我的答案。祝你好运
    【解决方案2】:

    您可以使用ROW_NUMBER 分区函数,按照这些思路应该可以解决问题:

    SELECT  [Station], [Num], [Tim]
    FROM
    (
        SELECT  Station,
                Num,
                Tim,
                ROW_NUMBER() OVER(PARTITION BY Station ORDER BY Num DESC, Tim DESC) [N]
        FROM    tst
    ) SQ
    WHERE    [N] = 1
    
    

    这基于获取每组行,按Station 列分组(这是ROW_NUMBER() 语句的PARTITION BY 部分所指的),然后首先按Num 对它们进行排序然后通过Tim 并为结果集中的每一行分配一个行号。然后,外部查询只取每个组的第一行,即对于Station 的每个值,它取NumTim 的最高值。

    【讨论】:

      【解决方案3】:

      更新 1

      推荐的方法是@Zhorov 提到的方法,但我会留下我的答案以给出所有可能的解决方案


      初步回答

      尝试使用类似的查询:

      SELECT T.station, T.maxnum, MAX(T.tim) as maxtim 
      FROM (SELECT station, tim, MAX(num) as maxnum
            GROUP BY station, tim ) T
      GROUP BY station, maxnum
      

      WITH CTE_1 as (SELECT station, tim, MAX(num) as maxnum
                     GROUP BY station, tim)
      SELECT station, maxnum, Max(tim)
      FROM CTE 
      GROUP BY station, tim
      

      【讨论】:

        猜你喜欢
        • 2019-07-27
        • 1970-01-01
        • 1970-01-01
        • 2021-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-15
        相关资源
        最近更新 更多