如何在SQL中对出现的列值进行编号?

时间:2018-10-26 09:43:55

标签: sql db2

假设我有一个这样的表:

ID | PODUCT
1  | apple
2  | apple
3  | banana
4  | apple
5  | banana

如果我使用:

SELECT S.ID, S.PRODUCT, C.cnt
FROM table1 S
INNER JOIN
(
    SELECT PRODUCT, COUNT(PRODUCT) AS cnt
    FROM table1
    GROUP BY PRODUCT
) C
    ON S.PRODUCT = C.PRODUCT

我得到这个:

ID | PODUCT  | cnt
1  | apple   | 3
2  | apple   | 3   
3  | banana  | 2
4  | apple   | 3
5  | banana  | 2

但是我需要的是这个

ID | PODUCT  | cnt
1  | apple   | 1
2  | apple   | 2   
4  | apple   | 3
3  | banana  | 1
5  | banana  | 2

所以我想我真的不需要计数,而是需要计数。我希望这是有道理的。哦,我正在使用DB2。

2 个答案:

答案 0 :(得分:1)

您可以使用窗口功能:

select s.*, count(*) over (partition by poduct order by id) as cnt
from table1 s;

但是,这实际上需要row_number()而不是count(),但是想法是相同的。

通过其他方式,您可以使用相关子查询:

select s.*, 
       (select count(*)
        from table1 s1
        where s1.poduct = s.poduct and s1.id <= s.id
       ) as cnt
from table1 s;

答案 1 :(得分:1)

ROW_NUMBER应该在这里工作:

SELECT
    ID,
    PODUCT,
    ROW_NUMBER() OVER (PARTITION BY PODUCT ORDER BY ID) cnt
FROM yourTable
ORDER BY
    PODUCT, ID;

如果由于某种原因您不能使用解析函数,则可以选择不使用解析函数的方法:

SELECT
    ID,
    PODUCT,
    (SELECT COUNT(*) FROM yourTable t2
     WHERE t1.PODUCT = t2.PODUCT AND t2.ID <= t1.ID) cnt
FROM yourTable t1
ORDER BY
    PODUCT, ID;

Demo

该演示是针对MySQL中的第二个查询的,但应在DB2上运行,而无需进行任何修改或进行很少的修改。