1

1 日の 1 分ごとの同時実行数を表示するには、SQL を使用する必要があります。以下のデータセットの場合:

drop table test

create table test (person varchar(2), caseid varchar(3), starttime datetime, endtime datetime)
insert into test values ('aa', '1', '01/01/2013 06:42', '01/01/2013 07:06')
insert into test values ('aa', '1', '01/01/2013 07:31', '01/01/2013 09:38')
insert into test values ('aa', '2', '01/01/2013 08:37', '01/01/2013 11:44')
insert into test values ('aa', '3','01/01/2013 09:39', '01/01/2013 11:31')
insert into test values ('aa', '4','01/01/2013 11:09', '01/01/2013 13:30')
insert into test values ('aa', '5','01/01/2013 12:05', '01/01/2013 15:38')
insert into test values ('aa', '6', '01/01/2013 13:58', '01/01/2013 14:13')
insert into test values ('aa', '7', '01/01/2013 15:53', '01/01/2013 16:14')
insert into test values ('bb', '8', '01/01/2013 08:42', '01/01/2013 09:06')
insert into test values ('bb', '8', '01/01/2013 10:31', '01/01/2013 19:38')
insert into test values ('bb', '8','01/01/2013  20:37', '01/01/2013 21:44')
insert into test values ('bb', '9', '01/01/2013 09:39', '01/01/2013 11:31')
insert into test values ('bb', '9', '01/01/2013 11:45', '01/01/2013 13:30')
insert into test values ('bb', '9', '01/01/2013 12:05', '01/01/2013 15:38')
insert into test values ('bb', '10', '01/01/2013 13:58', '01/01/2013 14:13')
insert into test values ('bb', '10', '01/01/2013 15:53', '01/01/2013 16:14')

結果は次のようになります。

aa  01/01/2013 6:42     1
aa  01/01/2013 6:43     1
aa  01/01/2013 6:44     1
....
....
aa  01/01/2013 8:37     2
aa  01/01/2013 8:38     2
....
....
bb  01/01/2013 8:42     1
bb  01/01/2013 8:43     1
bb  01/01/2013 10:31    2
....
....

ありがとう

4

3 に答える 3

0
This seems to work, but there may be a more elegant solution:

-- get range of days involved
declare @minDate date = (select MIN(starttime) from test)
declare @maxDate date = (select MAX(endtime) from test)

-- create table containing all days
if OBJECT_ID('tempdb..#days') is not null
    drop table #days

create table #days (d date)
declare @day date = @minDate
while @day <= @maxDate
begin
    insert #days (d) values (@day)
    set @day = DATEADD(day, 1, @day)
end

-- create table containing all minutes in the day
if OBJECT_ID('tempdb..#minutes') is not null
    drop table #minutes

create table #minutes (m int)

declare @minute int = 0
while @minute < 24*60
begin
    insert #minutes (m) values (@minute)
    set @minute = @minute + 1
end

select person, dateadd(minute, m, convert(datetime, startdate)), c from
(
    select person, m, startdate, count(m) c from 
    (
        -- cross join to select all days and minutes
        select d.d, m.m from #days d cross join #minutes m
    )
    t0
    inner join
    (
        select 
            person, 
            convert(date, starttime) startdate,
            datediff(minute, convert(date, starttime), starttime) startmin,
            datediff(minute, convert(date, endtime), endtime) endmin
        from test
    )
    t1
    on t0.m between t1.startmin and t1.endmin
    and t0.d = t1.startdate
    group by person, m, startdate
)
t2
order by person, startdate, m, c
于 2013-02-12T22:44:41.800 に答える
0

CTE とインライン ビューをサポートするデータベースを使用する場合のアプローチ方法は次のとおりです。

  1. 最初に、指定された日付の 1 日の (24*60) 分の 2 列のリストを生成する CTE:

    時間1 時間2

    2013-02-12 00:00、2013-02-12 00:01 . . . 2013-02-12 23:59、2013-02-13 00:00

  2. その CTE をケース テーブルに左結合します。cases.starttime は time1 と time2 の間にあり、cases.endtime は time1 と time2 の間にあります。これにより、その 1 分間にケースのどの部分も進行中でなかった場合は null が返されるか、その 1 分間にケースが進行中であった場合は caseid と personid が返されます。

  3. 上記をインライン ビューにします。最終的には、その日のすべての分のセットと、左結合のケース ID と個人 ID、または null になります。

    time1、time2、caseid、personid

  4. そのインライン ビューから選択するwhere caseid is not nullと、1 つまたは複数のケースが進行中の議事録が表示されます。次にgroup by personid, time1、count(caseid) を実行すると、その特定の 1 分間の時間帯における 1 人あたりのケースの集計が得られます。

于 2013-02-13T12:24:55.497 に答える