0

データベース (SQL Server 2008) に次の列/データを持つテーブルがあります。

 Emp ID        Start DT       End DT        Start Time     End Time     ABSTYPE      
20011664      13/02/2013     13/02/2013     09:00         17:00         Sick
20011664      14/02/2013     14/02/2013     09:00         17:00         Sick
20011664      15/02/2013     15/02/2013     09:00         17:00         Sick
20011664      19/02/2013     19/02/2013     09:00         17:00         Sick
20099999      14/02/2013     14/02/2013     09:00         17:00         Sick

次を返すクエリが必要です

20011664      13/02/2013      15/02/2013    09:00         17:00         Sick
20011664      19/02/2013      19/02/2013    09:00         17:00         Sick
20099999      14/02/2013      14/02/2013    09:00         17:00         Sick

つまり、継続的な病気の期間ごとに 1 つの行を返します。

4

2 に答える 2

1

あなたはこのようにそれを行うことができます:

CREATE TABLE #tbl ([Emp ID]   INT,     [Start DT]     DATE,  [End DT]     DATE,   [Start Time]    TIME, [End Time] TIME, ABSTYPE VARCHAR(100))
INSERT #tbl VALUES
(20011664,      '13/02/2013' ,    '13/02/2013'  ,   '09:00'    ,     '17:00'    ,     'Sick'),
(20011664,      '14/02/2013' ,    '14/02/2013'  ,   '09:00'    ,     '17:00'    ,     'Sick'),
(20011664,      '15/02/2013' ,    '15/02/2013'  ,   '09:00'    ,     '17:00'    ,     'Sick'),
(20011664,      '19/02/2013' ,    '19/02/2013'  ,   '09:00'    ,     '17:00'    ,     'Sick'),
(20099999,      '14/02/2013' ,    '14/02/2013'  ,   '09:00'    ,     '17:00'    ,     'Sick')

;WITH a AS
(
    SELECT  *
            , DATEDIFF(DAY, 0, [Start DT]) - 
                DENSE_RANK() OVER (PARTITION BY [Emp ID] ORDER BY DATEDIFF(DAY, 0, [Start DT])) 
                AS part
    FROM    #tbl
)

SELECT  a.[Emp ID]
        , MIN(a.[Start DT])
        , MAX(a.[End DT])
FROM    a
GROUP BY
        a.[Emp ID], a.part

この素晴らしい方法は、Martin Smithの回答(リンク)から取得され、この例に合わせて調整されました。Martinによれば、ItzikBenGanによって導入されました。

于 2013-02-27T13:17:39.283 に答える
0
;with cte as (
    select *
    from [<YourTable>]

    union all

    select t.[Emp ID], t.[Start DT], t.[End DT] + 1, t.[Start Time], t.[End Time], t.[ABSTYPE]
    from cte t
    inner join [<YourTable>] d on t.[Emp ID] = d.[Emp ID] and t.[End DT] + 1 = d.[Start DT]
), results as (
    select *, datediff(day, [Start DT], [End DT]) as daydiff, max(datediff(day, [Start DT], [End DT])) over (partition by [Emp ID], [Start DT]) as max_start_daydiff, max(datediff(day, [Start DT], [End DT])) over (partition by [Emp ID], [End DT]) as max_end_daydiff
    from cte 
)
select [Emp ID], [Start DT], [End DT], [Start Time], [End Time], [ABSTYPE]
from results
where daydiff = max_start_daydiff
and daydiff = max_end_daydiff
于 2013-02-27T09:51:58.073 に答える