sql создать порядковый номер в подмножестве - apache derby - PullRequest
6 голосов
/ 03 апреля 2020

Может генерировать порядковый номер, используя следующий запрос

CREATE SEQUENCE seqno AS integer
START WITH 1;

SELECT t1.*,
   (NEXT VALUE
    FOR seqno) AS seqno
FROM
  (SELECT l.TRANSACTION_ID,
      l.HSN
   FROM RWLINEITEM l
   WHERE l.TRANSACTION_ID IN ('CS610-20-10003','CS610-20-10002')
   GROUP BY l.TRANSACTION_ID,l.HSN) t1

это дает результат

Sql Output

Требуется сгенерировать порядковый номер по транзакции и HSN, например

Expected result

Есть ли способ получить этот результат. Использование derby-10.13.1.1

1 Ответ

3 голосов
/ 03 апреля 2020

Кажется, что Derby не полностью поддерживает стандартную оконную функцию row_number().

Типичный подход для эмуляции этого состоит в использовании подзапроса, который подсчитывает, сколько строк имеют одинаковые transaction_id и меньшие hsn, вот так:

select 
    transaction_id, 
    hsn, 
    1 + coalesce(
        (
            select count(*) 
            from rwlineitem l1 
            where l1.transaction_id = l.transaction_id and l1.hsn < l.hsn
        ),
        0
    ) seqno 
from rwlineitem l
where transaction_id in ('CS610-20-10003','CS610-20-10002')
order by transaction_id, hsn

Обратите внимание, что при наличии дубликатов (transaction_id, hsn) кортежей они получат тот же seqno. Это похоже на то, как работает оконная функция rank(). Если вам нужен уникальный номер, вы можете попробовать добавить еще один случайный критерий сортировки:

select 
    transaction_id, 
    hsn, 
    1 + coalesce(
        (
            select count(*) 
            from rwlineitem l1 
            where 
                l1.transaction_id = l.transaction_id 
                and (
                    l1.hsn < l.hsn 
                    or (l1.hsn = l.hsn and random() < 0.5)
                )
        ),
        0
    ) seqno 
from rwlineitem l
where transaction_id in ('CS610-20-10003','CS610-20-10002')
order by transaction_id, hsn
...