我有一个标识每一行的 ID、一个 article_ID、一个 supplier_ID 和一个库存。
+----+------------+-------------+-------+
| ID | article_ID | supplier_ID | stock |
+----+------------+-------------+-------+
| 1 | 1 | 1 | 18 |
| 2 | 1 | 2 | 1 |
| 3 | 1 | 3 | 20 |
| 4 | 2 | 1 | 5 |
| 5 | 2 | 2 | 40 |
| 6 | 3 | 1 | 56 |
| 7 | 3 | 3 | 7 |
| 8 | 3 | 4 | 12 |
+----+------------+-------------+-------+
我需要标记提供最大库存的供应商并获得以下结果:
+----+------------+-------------+-------+------+
| ID | article_ID | supplier_ID | stock | flag |
+----+------------+-------------+-------+------+
| 1 | 1 | 1 | 18 | 0 |
| 2 | 1 | 2 | 1 | 0 |
| 3 | 1 | 3 | 20 | 1 |
| 4 | 2 | 1 | 5 | 0 |
| 5 | 2 | 2 | 40 | 1 |
| 6 | 3 | 1 | 56 | 1 |
| 7 | 3 | 3 | 7 | 0 |
| 8 | 3 | 4 | 12 | 0 |
+----+------------+-------------+-------+------+
我对这个问题的理解是,我需要从我标识最大股票值(value)行 ID 的选择中进行选择,但我不知道如何到达那里。 我卡住了...需要你的帮助 stackoverflow 的骑士们!
最佳答案
使用窗口函数:
select t.*,
(case when stock = max(stock) over (partition by article_id)
then 1 else 0
end) as flag
from t;
注意:这将标记多个供应商,如果它们都具有相同的最大值。如果您只想要一个,请使用 row_number()
:
select t.*,
(case when row_number() over (partition by article_id order by stock desc) = 1
then 1 else 0
end) as flag
from t;
关于sql - 如何标记具有最大值的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54675780/