Аналитическая функция: ROW_NUMBER () - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть таблица «Счет-фактура»

id integer Primary key
customer_id Integer
total Number (*,2)

Запрос состоит в том, чтобы отобразить все customer_id, итоговый и текущий серийный номер для каждого клиента с псевдонимом «SNO».И записи должны отображаться в порядке возрастания на основе customer_id, а затем по SNO.

Подсказки:

  • Аналитическая функция: ROW_NUMBER ()
  • Аналитическая статья:query_partition_clause и order_by_clause.

Я написал следующий запрос:

Select customer_id,
       total,
       ROW_NUMBER( ) OVER (PARTITION BY customer_id ORDER BY customer_id ASC) AS "SNO"
from invoice;

Но результат не удался.Чего мне не хватает?Также подразумевается, что «записи должны отображаться в порядке возрастания на основе customer_id , а затем по SNO ».

Результат, который я получаю, выглядит следующим образом:
CUSTOMER_ID TOTAL SNO
1 70000 1
2 250000 1
2 560000 2
3 200000 1
3 45000 2

4 475000 1
5 500001
5 10000 2

6 600000 1
6 90000 2

Ожидаемый результат:
CUSTOMER_ID TOTAL SNO
1 70000 1
2 250000 1
2 560000 2
3 45000 1
3 200000 2

4 475000 1
5 10000 1
5 50000 2

6 600000 1
6 90000 2
ИТОГО Данные столбца не совпадают.

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Вы близки, вам, вероятно, нужно заказать row_number на id (при условии, что он возрастает в зависимости от времени)

Select customer_id,
       total,
       ROW_NUMBER( ) OVER (PARTITION BY customer_id ORDER BY id ASC) AS "SNO"
from invoice
order by customer_id, "SNO" -- should be the default anyway (but there's no guarantee)
0 голосов
/ 21 ноября 2018

Я не нашел ни одного заказа по предложению в вашем запросе, еще одна проблема, в каком порядке вы хотите создать SNO?используя id или total, которые повлияют на ваш заказ

 with cte as
(
select  1  cid, 70000  total from dual
    union all
select 2, 250000 from dual
    union all
select 2, 560000 from dual
union all
select 3, 200000 from dual
    union all
select 3, 45000  from dual
    union all
select 4, 475000 from dual
union all
select 5, 50000 from dual
union all
select 5, 10000 from dual
union all
select 6, 600000 from dual
union all
select 6, 90000 from dual

)Select cid,total,ROW_NUMBER( ) OVER (PARTITION BY cid ORDER BY total ) AS "SNO" from cte order by cid,SNO
...