假设我有一个这样的表:
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。
答案 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;
该演示是针对MySQL中的第二个查询的,但应在DB2上运行,而无需进行任何修改或进行很少的修改。