我在SQL Server数据库中有一个EMPLOYEE表,其中包含以下列和数据
我想合并第一,第二和第三条记录(在START_DATE排序),因为它们只是扩展名,因此产生以下输出为
如您所见,我已经合并了前3条记录,并从第一行获取了START_DATE,从第三行获取了END_DATE
我需要一个SQL查询来创建此输出,如果他们的employee_types相同,它将合并一个employee_id的连续记录(基于时间)。
答案 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
演示:
答案 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