0

データ列を持つテーブルがある場合、エントリ間の期間を時間単位でカウントするにはどうすればよいですか。1行が前の行の状態変化を効果的に意味すると仮定します。例えば

TableA
Name Status(Int) DateTime (DateTiem2)
Bob In '2012-11-22 00:00:00'
Bob Out '2012-11-23 00:00:00'
Bob In '2012-11-24 00:00:00'
Bob Out '2012-11-25 00:00:00'
Bob In '2012-11-26 00:00:00'
Bob Out '2012-11-26 12:30:00'
Bob Absent '2012-11-27 00:00:00'
Bob In '2012-11-27 01:00:00
Jo In '2012-11-22 00:00:00'
Jo Out '2012-11-23 00:00:00'
Jo In '2012-11-24 00:00:00'
Jo Out '2012-11-25 00:00:00'
Jo In '2012-11-26 00:00:00'
Jo Out '2012-11-26 12:30:00'
Jo Absent '2012-11-27 00:00:00'
Jo In '2012-11-27 01:00:00

Bob In からの合計クエリ結果: 60.5 時間 Bob Out: 59.5 時間 Bob Absent: 1 時間 Jo In: 60.5 時間 Jo Out: 59.5 時間 Jo Absent: 1 時間

4

1 に答える 1

1

テーブルをそれ自体に結合して、各行が次の行と順番に一致するようにします。次に、日時の量を分単位で減算し (小数時間が必要なため)、その分を 60 で割ります。

declare @T table
(
    name varchar(20),
    [status] int,
    [DateTime] datetime2
)

insert into @T (name, [status], [DateTime])
values ('Bob', 0, '2012-11-22 00:00:00'),
('Bob', 1, '2012-11-23 00:00:00'),
('Bob', 0, '2012-11-24 00:00:00'),
('Bob', 1, '2012-11-25 00:00:00'),
('Bob', 0, '2012-11-26 00:00:00'),
('Bob', 1, '2012-11-26 12:30:00'),
('Bob', 2, '2012-11-27 00:00:00'),
('Bob', 1, '2012-11-27 01:00:00'),
('Jo', 0, '2012-11-22 00:00:00'),
('Jo', 1, '2012-11-23 00:00:00'),
('Jo', 0, '2012-11-24 00:00:00'),
('Jo', 1, '2012-11-25 00:00:00'),
('Jo', 0, '2012-11-26 00:00:00'),
('Jo', 1, '2012-11-26 12:30:00'),
('Jo', 2, '2012-11-27 00:00:00'),
('Jo', 1, '2012-11-27 01:00:00')

;with RowNumbers (RowNum, name, [status], [DateTime])
as
(
    select
        ROW_NUMBER() over (partition by name order by [DateTime]),
        name,
        [status],
        [DateTime]
    from @T
)
select
    T1.name,
    case T1.[status]
        when 0 then 'In'
        when 1 then 'Out'
        when 2 then 'Absent'
      end as [status],
    sum(datediff(MINUTE, T1.[DateTime], T2.[DateTime]) / 60.0) as [hours]
from RowNumbers T1
    inner join RowNumbers T2
        on T1.RowNum = T2.RowNum - 1 -- joins the current row to the next one
        and T1.name = T2.name
group by T1.name, T1.[status]
order by T1.Name, T1.[status]

上記のクエリは、行番号にインデックスを持つ派生テーブルほどには機能しない可能性があることに注意してください。

また、クエリでは、名前とステータス列のデータ型と実際の値についていくつかの仮定を立てました。一般的なアプローチは同じままです。

于 2013-11-01T14:01:28.353 に答える