Oracle SQL извлекает повторяющиеся результаты из некоторых столбцов - PullRequest
1 голос
/ 30 марта 2019

Мои данные имеют категории и подкатегории в отдельных таблицах. Когда я пишу запрос, чтобы присоединиться к ним, я получаю таблицу ниже с повторяющимися строками категорий:

|  Col1 |    Col2   |   Col3     | Col 4 | 
|-------|-----------|------------|-------|
|  Cat1 | Cat1 Data | Subcat 1.1 | Etc   |
|-------|-----------|------------|-------|
|  Cat1 | Cat1 Data | Subcat 1.2 | Etc   |
|-------|-----------|------------|-------|
|  Cat1 | Cat1 Data | Subcat 1.3 | Etc   |
|-------|-----------|------------|-------|
|  Cat2 | Cat2 Data | Subcat 2.1 | Etc   |
|-------|-----------|------------|-------|
|  Cat2 | Cat2 Data | Subcat 2.2 | Etc   |
|-------|-----------|------------|-------|
|  Cat2 | Cat2 Data | Subcat 2.3 | Etc   |
|-------|-----------|------------|-------|

Есть ли способ заставить это распечатать с основной категорией, показываемой только один раз?

|  Col1 |    Col2   |   Col3     | Col 4 | 
|-------|-----------|------------|-------|
|  Cat1 | Cat1 Data | Subcat 1.1 | Etc   |
|-------|-----------|------------|-------|
|       |           | Subcat 1.2 | Etc   |
|-------|-----------|------------|-------|
|       |           | Subcat 1.3 | Etc   |
|-------|-----------|------------|-------|
|  Cat2 | Cat2 Data | Subcat 2.1 | Etc   |
|-------|-----------|------------|-------|
|       |           | Subcat 2.2 | Etc   |
|-------|-----------|------------|-------|
|       |           | Subcat 2.3 | Etc   |
|-------|-----------|------------|-------|

Поиск в Интернете возвращает только ссылки на использование различных групп или групп, которые на самом деле не соответствуют сценарию использования. Я понимаю, что ответом здесь обычно является «использовать интерфейсный инструмент», но в моем случае это не совсем вариант.

Ответы [ 2 ]

1 голос
/ 30 марта 2019

Тебе лучше повторяться. Но вы можете использовать row_number():

select (case when row_number() over (partition by col1, col2 order by ?) = 1
             then col1
        end) as col1
       (case when row_number() over (partition by col1, col2 order by ?) = 1
             then col2
        end) as col2,
       . . .
from t
order by col1, col2, ?;

Обратите внимание, что ? для столбца, который определяет порядок - что определяет «первый» для каждой строки.

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

1 голос
/ 30 марта 2019

Здравствуйте, кажется, что это делает то, что вы хотите

Данные (DDL)

create table example(
   col1 varchar(100),
   col2 varchar(100),
   col3 varchar(100),
   col4 varchar(100)
);

insert into example(col1,col2,col3,col4) values('Cat1','Cat1 Data', 'Subcat 1.1', 'Etc');
insert into example(col1,col2,col3,col4) values('Cat1','Cat1 Data', 'Subcat 1.2', 'Etc');
insert into example(col1,col2,col3,col4) values('Cat1','Cat1 Data', 'Subcat 1.3', 'Etc');
insert into example(col1,col2,col3,col4) values('Cat2','Cat2 Data', 'Subcat 2.3', 'Etc');
insert into example(col1,col2,col3,col4) values('Cat2','Cat2 Data', 'Subcat 2.3', 'Etc');
insert into example(col1,col2,col3,col4) values('Cat2','Cat2 Data', 'Subcat 2.3', 'Etc');

SQL-запрос (ответ)

select
   CASE WHEN lag(col1) over (partition by null order by col1) = col1 THEN null ELSE col1 END col1,
   CASE WHEN lag(col2) over (partition by null order by col2) = col2 THEN null ELSE col2 END col2,
   col3, col4
From example
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...