SQL查询合并记录

时间:2019-01-20 02:39:26

标签: sql sql-server merge

我在SQL Server数据库中有一个EMPLOYEE表,其中包含以下列和数据

enter image description here

我想合并第一,第二和第三条记录(在START_DATE排序),因为它们只是扩展名,因此产生以下输出为

enter image description here

如您所见,我已经合并了前3条记录,并从第一行获取了START_DATE,从第三行获取了END_DATE

我需要一个SQL查询来创建此输出,如果他们的employee_types相同,它将合并一个employee_id的连续记录(基于时间)。

3 个答案:

答案 0 :(得分:1)

这应该有所帮助,尽管您应该真正标记目标数据库,并避免随机标记。

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

答案 1 :(得分:1)

这是一个空白问题,但有日期范围。最通用的解决方案是假设行之间可能存在间隙(尽管您的数据没有间隙)。

您可以通过找出“持续时间”从哪里开始来解决此问题。在这种情况下,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;

答案 2 :(得分:0)

以下查询有助于解决问题

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