SQL Запрос заменить дубликаты на NULL или пустую строку ORACLE - PullRequest
1 голос
/ 20 июня 2020

Я использую oracle SQL и у меня есть таблица с повторяющимися строками, подобная этой:

Month   Product

March   ENVOY & External Keyboard (22)
March   ENVOY & External Keyboard (22)
March   ENVOY & External Keyboard (22)
March   ENVOY & External Keyboard (22)
March   ENVOY & External Keyboard (22)
March   ENVOY & External Keyboard (22)
April   ENVOY & External Keyboard (22)
April   ENVOY & External Keyboard (22)
April   ENVOY & External Keyboard (22)
April   ENVOY & External Keyboard (22)
April   ENVOY & External Keyboard (22)

Мне нужно преобразовать ее примерно так:

Month   Product

March   ENVOY & External Keyboard (22)
        ENVOY & External Keyboard (22)
        ENVOY & External Keyboard (22)
        ENVOY & External Keyboard (22)
        ENVOY & External Keyboard (22)
        ENVOY & External Keyboard (22)
April   ENVOY & External Keyboard (22)
        ENVOY & External Keyboard (22)
        ENVOY & External Keyboard (22)
        ENVOY & External Keyboard (22)
        ENVOY & External Keyboard (22)

Я пытаюсь использовать SELECT (case when row_number() over (partition by times.calendar_month_name order by (select NULL)) = 1 then times.calendar_month_name end) Month, но не работает ... Есть идеи?

Ответы [ 3 ]

2 голосов
/ 20 июня 2020

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

select 
  nullif(Month, lag(Month) over (order by null)) Month,
  Product
from tablename

См. демонстрацию . Результатов:

> MONTH | PRODUCT                       
> :---- | :-----------------------------
> March | ENVOY & External Keyboard (22)
>       | ENVOY & External Keyboard (22)
>       | ENVOY & External Keyboard (22)
>       | ENVOY & External Keyboard (22)
>       | ENVOY & External Keyboard (22)
>       | ENVOY & External Keyboard (22)
> April | ENVOY & External Keyboard (22)
>       | ENVOY & External Keyboard (22)
>       | ENVOY & External Keyboard (22)
>       | ENVOY & External Keyboard (22)
>       | ENVOY & External Keyboard (22)
1 голос
/ 20 июня 2020

Кусок торта в SQL* Плюс:

SQL> break on month
SQL>
SQL> select month, product from test order by month desc;

MONTH      PRODUCT
---------- ------------------------------
March      ENVOY & External Keyboard (22)
           ENVOY & External Keyboard (22)
           ENVOY & External Keyboard (22)
           ENVOY & External Keyboard (22)
           ENVOY & External Keyboard (22)
           ENVOY & External Keyboard (22)
April      ENVOY & External Keyboard (22)
           ENVOY & External Keyboard (22)
           ENVOY & External Keyboard (22)
           ENVOY & External Keyboard (22)
           ENVOY & External Keyboard (22)

11 rows selected.

SQL>
0 голосов
/ 20 июня 2020

Этот тип операции действительно лучше выполнять на уровне приложения. Вы можете использовать row_number(), но вам нужно быть осторожным:

select (case when seqnum = 1 then month end) as month, product
from (select t.*,
             row_number() over (partition by month order by month) as seqnum
      from t
     ) t
order by month, seqnum;

Обратите внимание, что запрос SQL возвращает результаты в неопределенном порядке . Таким образом, вам нужен внешний order by, чтобы гарантировать упорядочение (т.е. что «первая» строка имеет значение). Поскольку вы имеете дело с точными дубликатами, уникального ключа сортировки не существует, поэтому даже два вызова row_number() могут дать разные результаты - отсюда и использование подзапроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...