首页 > 解决方案 > 如何用最大值标记行

问题描述

我有一个标识我的每一行的 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的骑士!

标签: sqlsql-server

解决方案


使用窗口函数:

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;

推荐阅读