【发布时间】:2021-11-20 19:58:38
【问题描述】:
我有一个类似的表:
| Item | Class | Qty | Loc |
|---|---|---|---|
| Apple | Fruit1 | 1 | N |
| Apple | Fruit1 | 1 | NW |
| Apple | Fruit2 | 0 | W |
| Apple | Fruit3 | 1 | N |
| Orange | Fruit1 | 10 | SE |
| Orange | Fruit2 | 1 | SW |
我正在尝试查询所有Class 最小的行,每个Item 具有最小的非零 Qty。因此,如果相同的Item 对多个类具有相同的Qty,它将选择最低的Class (Fruit1 Fruit2 Fruit3
SELECT A.*,
RANK() OVER(
PARTITION BY ITEM, CLASS
ORDER BY QTY ASC, CLASS ASC) AS item_rank
FROM fruits.info
WHERE QTY <> 0
获得排名来选择,这是行不通的。排名结果应该是:
| Item | Class | Qty | Loc | item_rank |
|---|---|---|---|---|
| Apple | Fruit1 | 1 | N | 1 |
| Apple | Fruit1 | 1 | NW | 1 |
| Apple | Fruit3 | 1 | N | 2 |
| Orange | Fruit1 | 10 | SE | 2 |
| Orange | Fruit2 | 1 | SW | 1 |
然后我会为item_rank = 1 使用嵌套选择:
SELECT B.* FROM (
SELECT A.*,
RANK() OVER(
PARTITION BY ITEM, CLASS
ORDER BY QTY ASC, CLASS ASC) AS item_rank
FROM fruits.info
) B
WHERE B.item_rank = 1
要得到最终结果,应该是:
| Item | Class | Qty | Loc | item_rank |
|---|---|---|---|---|
| Apple | Fruit1 | 1 | N | 1 |
| Apple | Fruit1 | 1 | NW | 1 |
| Orange | Fruit2 | 1 | SW | 1 |
我如何构建我的RANK() 以实现这一目标?有没有更有效的方法?
【问题讨论】: