如何标记具有最大值的行

Cec*_*de. 5 sql sql-server

我有一个 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    |
+----+------------+-------------+-------+
Run Code Online (Sandbox Code Playgroud)

我需要标记提供最大库存的供应商并得到以下结果:

+----+------------+-------------+-------+------+
| 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    |
+----+------------+-------------+-------+------+
Run Code Online (Sandbox Code Playgroud)

我对这个问题的理解是,我需要从确定最大股票价值行 ID 的选择中进行选择,但我不知道如何到达那里。我被困住了...需要你的帮助 stackoverflow 的骑士!

Gor*_*off 6

使用窗口函数:

select t.*,
       (case when stock = max(stock) over (partition by article_id)
             then 1 else 0
        end) as flag
from t;
Run Code Online (Sandbox Code Playgroud)

注意:如果多个供应商都具有相同的最大值,这将标记多个供应商。如果您只想要一个,请使用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;
Run Code Online (Sandbox Code Playgroud)