sql - 如何用最大值标记行
问题描述
我有一个标识我的每一行的 ID、一个 article_ID、一个供应商_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 |
+----+------------+-------------+-------+------+
我对这个问题的理解是,我需要从一个选择中进行选择,其中我确定了最大股票价值行 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;
推荐阅读
- vba - 从 VBA 同步运行 shell 命令,同时显示和捕获输出
- swift - 突出显示两个 CollectionView 中的单元格
- javascript - Window.prompt 只接受数值
- neo4j - 使用文本文件删除 neo4j 中的停用词
- macos - 如何在 Mac OSX 上更新 OpenSSL
- php - connect() 到 unix:/var/run/php/php7.2-fpm.sock 失败(11:资源暂时不可用)
- android - 错误:无法在 android studio 中访问 zzbgl
- reactjs - onChange 或 onBlur 来改变 ReactJs 中的状态?
- sql-server - 存储过程变量声明
- google-cloud-sql - 谷歌云SQL二代| MySQL 服务器正在使用 --read-only 选项运行,因此它无法执行此语句