在将 MIN 或 MAX 与 Group By 一起使用时保留其他列

Retaining additional Columns whilst using MIN or MAX with Group By

第一次 post 在 Whosebug 上,SQL 的新手(以及一般的任何代码)会很感激我对分组查询的一些建议。根据下面的示例数据集,我希望根据 ID/Name 和 return 对每个人的最低销售额进行分组。我遇到的困难是我还想 return 与最低销售业绩相关的 REGION 和 QTR 信息。

ID NAME REGION SALES QTR.
1 Luke NORTH 45 1
2 Danny WEST 67 2
3 Elle NORTH 73 1
1 Luke WEST 32 4
2 Danny EAST 22 3
2 Danny EAST 18 2

所以基本上分组到 table 如下

ID NAME REGION MIN SALES QTR.
1 Luke WEST 32 4
2 Danny EAST 18 2
3 Elle NORTH 73 1

如果我将额外的列引入组中,它会为每个人创建多行,如果我将它们排除在外,我将丢失相关数据。

任何人都可以提供帮助,从网上看,我可能必须加入 table 自己,尽管我不确定该怎么做。

谢谢

汤姆

在子查询中计算 row_number,然后对其进行过滤。

SELECT ID, NAME, REGION, SALES AS MIN_SALES, QTR
FROM
(
    SELECT ID, NAME, REGION, SALES, QTR
    , ROW_NUMBER() OVER (PARTITION BY ID ORDER BY SALES ASC) AS rn
    FROM YourTable
) q
WHERE rn = 1
ORDER BY id

如果您想要 MAX_SALES,则在 row_number 中按销售额 DESC(降序)排序。

https://dbfiddle.uk/?rdbms=oracle_18&fiddle=ebb85bdb1b93e668aadc688c18351746

  with data(ID, NAME,   REGION, SALES,  QTR) as
    (select 1,  'Luke', 'NORTH',45, 1 from dual union all
    select 2,   'Danny','WEST', 67, 2 from dual union all
    select 3,   'Elle', 'NORTH',73, 1 from dual union all
    select 1,   'Luke', 'WEST', 32, 4 from dual union all
    select 2,   'Danny','EAST', 22, 3 from dual union all
    select 2,   'Danny','EAST', 18, 2 from dual 
    ),
    minS as (select ID , min(Sales) minsales
    from data
    group by ID)
    Select data.id, data.name,data.region,data.sales "min sales" ,data.qtr from data
    join minS on minS.ID= data.Id
    and minS.minsales= data.sales
    order by data.id