Oracle SQL удаляет дубликаты результатов из некоторых столбцов

#sql #oracle

#sql #Oracle

Вопрос:

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

 |  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   |
|-------|-----------|------------|-------|
  

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

Ответ №1:

Привет, похоже, это действительно делает то, что вы хотите

Данные (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
  

Комментарии:

1. Интересное решение. Кстати, похоже, что partition by null может быть опущено sqlfiddle.com /#!4/def46f/1

Ответ №2:

Вам лучше избегать повторения. Но вы можете использовать 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 строки могут быть возвращены в любом порядке, но порядок важен в этом случае.