代码之家  ›  专栏  ›  技术社区  ›  Denis

有没有一种简单的方法来获取与像min和max这样的聚合相关联的id?

  •  1
  • Denis  · 技术社区  · 6 年前

    对于通过一些难看的sql代码获取与聚合操作(如min和max)相关联的id的问题,我总是用蛮力来解决。我只是想知道是否有正确/干净的方法来解决这个问题。假设您有以下内容:

    SELECT 1 AS groupid, 1 AS id, 100 AS val
    INTO #a
    UNION
    SELECT 1, 2, 50
    UNION
    SELECT 1, 3, 75
    UNION
    SELECT 2, 2, 120
    UNION
    SELECT 2, 4, 22
    UNION
    SELECT 2, 1, 45
    

    注#1: id 在一个系统中是独一无二的 groupid

    val 可以具有相同的值,因此在这种情况下 身份证件 柱 将是对应于的第一个id

    假设我希望结果如下所示:

    groupid | min_id | min_val | max_id | max_val
       1        2         50       1        100
       2        3         22       2        120
    
    2 回复  |  直到 6 年前
        1
  •  3
  •   Gordon Linoff    6 年前

    可以使用条件聚合或窗口函数。例如,您可以使用 first_value() :

    select distinct group_id,
           min(val) over (partition by groupid) as min_val,
           first_value(id) over (partition by groupid order by val asc) as min_id, 
           max(val) over (partition by groupid) as max_val,
           first_value(id) over (partition by groupid order by val desc) as max_id
    from t;
    

    第一个_值() 作为聚合函数,因此它使用 select distinct

        2
  •  -1
  •   Israel Pina    6 年前

    使用 GROUP BY

    SELECT groupid, MIN(id) AS min_id, MIN(val) as min_val, MAX(id) AS max_id, MAX(val) as max_val 
    FROM table
    GROUP BY groupid