SQL-запрос для объединения записей - PullRequest
0 голосов
/ 20 января 2019

У меня есть таблица EMPLOYEE в базе данных SQL Server со следующими столбцами и данными

enter image description here

Я хочу объединить 1-ю, 2-ю и 3-ю записи( ORDERED BY START_DATE ), поскольку они являются просто расширениями и выдают следующий вывод:

enter image description here

Как видите, я имеюобъединил первые 3 записи и взял START_DATE из 1-й строки и завершил END_DATE из 3-й строки

Мне нужен SQL-запрос для создания этого вывода, который объединит последовательные записи (на основе времени) для employee_id, еслиу них одинаковые типы сотрудников.

Ответы [ 3 ]

0 голосов
/ 20 января 2019

Это проблема пробелов и островков, но с диапазонами дат.Самое общее решение состоит в том, чтобы предположить, что между строками могут быть пробелы (хотя ваши данные этого не имеют).

Вы можете решить эту проблему, выяснив, где начинаются «периоды постоянства».В этом случае lag() ваш друг.Затем, когда вы найдете, где они начинаются, совокупная сумма идентифицирует группы, и агрегация решает проблему:

select employee_id, employee_type,
       min(start_date), max(end_date)
from (select e.*,
             sum(case when start_date = dateadd(day, 1, prev_end_date) then 1 else 0 end) over
                 (partition by employee_id, employee_type) as grp
      from (select e.*,
                   lag(end_date) over (partition by employee_id, employee_type order by start_date) as prev_end_date
            from employee e
           ) e
     ) e
group by employee_id, employee_type, grp;
0 голосов
/ 21 января 2019

Следующий запрос помог решить проблему

SELECT employee_id,
       employee_type,
       MIN(start_date) ,
       MAX(end_date) 
FROM   (SELECT *,
DENSE_RANK() OVER (PARTITION BY employee_id ORDER BY start_date),
DENSE_RANK() OVER (PARTITION BY employee_id, employee_type ORDER BY start_date),
                DENSE_RANK() OVER (PARTITION BY employee_id ORDER BY start_date) - 
                DENSE_RANK() OVER (PARTITION BY employee_id, employee_type ORDER BY start_date) AS Grp
         FROM   employee) T
GROUP  BY employee_id,
       employee_type,
          Grp
ORDER  BY 3 asc 
0 голосов
/ 20 января 2019

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

Для SQL Server и MySQL

SELECT 
    employee_id
,   employee_type 
,   MIN(start_date) start_date
,   MAX(end_date) end_date
FROM 
    EMPLOYEE 
GROUP BY 
    employee_id
,   employee_type 
,   YEAR(end_date)
ORDER BY start_date

и Для Oracle

SELECT 
    employee_id
,   employee_type 
,   MIN(start_date) start_date
,   MAX(end_date) end_date
FROM 
    EMPLOYEE 
GROUP BY 
    employee_id
,   employee_type 
,   extract(year from end_date)
ORDER BY start_date

Демонстрационные версии:

SQL Server

Oracle

MySQL

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