在将 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
第一次 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