2017-02-09 18 views
0

Подобная проблема может быть поднята здесь раньше, но очень сложно найти ответ, который я ищу.PostgreSQL - группировка определенных столбцов в SQL

Скажем, у меня есть таблица вроде этого:

 isbn  |  Name 1    | Name 2  | Name 3  | Date 
---------------+--------------------------+--------------+------------+------------ 
9998-01-101-9 | Duomenu bazes   | Tadas  | Onaitis | 1995-12-31 
9998-01-101-9 | Duomenu bazes   | Jonas  | Onaitis | 1994-02-28 
9998-01-101-9 | Duomenu bazes   | Petras  | Jonaitis | 1995-05-30 
9998-01-102-7 | Programavimo kalbos  | Petras  | Jonaitis | 1995-05-30 

Я хочу SELECT эту таблицу так, что для каждого отдельного ISBN и имя 1 было бы минимальная дата.

Этого можно легко добиться с помощью функции агрегата MIN().

И зная, что столбцы ISBN и Name 1 эквивалентны, мы могли бы легко GROUP BY эти столбцы и MIN(Date).

Однако у нас есть столбцы Имя 2 и Имя 3, привязанные к Дате.

И если мы попытаемся разместить их под предложением GROUP BY, они будут проверены при группировке, и мы этого не хотим.

Мы хотим, чтобы строки 1-3 были одной группой, но они отделены друг от друга, потому что имя 2 и имя 3 делают эти строки отличными.

Итак, как это сделать, имя 2 и имя 3 не сгруппированы, а привязаны к столбцу Date и действуют как 1 столбец?

Никаких новых созданий или представлений в таблице не допускается.

Попытка решения: внутренняя SELECT присоединение к дате из другой таблицы, но это не сработает, если даты дублируются.

+0

Похож на вопрос, связанный с OVER (Partition by ..), доступный в Oracle – Massimo

+0

Я мог бы использовать версию для Sybase ASE 15.7 – Horaciux

ответ

2

Вы можете использовать встроенный DISTINCT ON, чтобы получить строку с ранней датой для каждой комбинации ISBN и имени:

select distinct on (isbn, name_1) * 
from your_table 
order by isbn, name_1, date; 
0

В оракуле

Select isbn, name1, name2, name3,date,min(date)OVER (PARTITION BY isbn, name1) 

Может есть подобные конструкции в другом РСУБДЕ

 Смежные вопросы

  • Нет связанных вопросов^_^