Как нумеровать вхождения значения столбца в SQL? - PullRequest
0 голосов
/ 26 октября 2018

Допустим, у меня есть такая таблица:

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 голосов
/ 26 октября 2018

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 без изменений или с очень небольшими изменениями.

0 голосов
/ 26 октября 2018

Вы можете использовать оконную функцию:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...