2

私はイベント レコード データベースを持っています。各コスチュームのすべてのイベントを検索し、各コスチュームの最後のレコードから最初のレコードまで 1 週間間隔でグループ化する必要があります。

FirstEvent                  LastEvent               Client
==
2011-01-01 06:55:21.000 |2011-04-30 21:46:09.000    |Client1
2011-01-01 06:20:00.000 |2011-02-23 12:43:55.000    |Client2
2011-01-03 08:34:33.000 |2011-04-30 09:00:39.000    |Client3
2011-01-01 02:14:45.000 |2011-04-30 15:31:41.000    |Client4
2011-01-01 08:08:12.000 |2011-02-21 09:41:28.000    |Client5
2011-02-01 11:29:28.000 |2011-04-29 09:13:25.000    |Client6

次に、各クライアントのレコードを数えて、次のようにグループ化する必要があります

Client     From                    To                        Records
==
Client1   |2011-04-30 21:46:09.000 |2011-04-23 21:46:09.000  |200
Client1   |2011-04-16 21:46:09.000 |2011-04-09 21:46:09.000  |400
                                 ...Until the the first date
Client1   |2011-01-08 06:55:21.000 |2011-01-01 06:55:21.000  |250
Client2   |2011-02-23 12:43:55.000 |2011-02-16 12:43:55.000  |50
                                 ...The same for each user

誰かがこれを出力する方法を見つけるのを手伝ってくれることを願っています.

4

3 に答える 3

2

DATEDIFF 関数を使用して、週ごとにグループ化できます。

SELECT e.[Client]
, [From] = MIN(e.EventDate)
, [To] = MAX(e.EventDate)
, [Records] = COUNT(*)
FROM Events AS e
GROUP BY e.[Client]
, DATEDIFF(week, '1900-01-01', e.EventDate) 
于 2012-04-10T11:29:54.897 に答える
1

さて、これはまさにあなたが望んでいることだと思います:

SELECT CONVERT(datetime, '2011-01-01 06:55:21.000', 120) AS event, 'client1' AS Client
INTO #EVENTS
UNION ALL SELECT '2011-01-08 06:55:20.000', 'client1'
UNION ALL SELECT '2011-04-30 21:46:09.000', 'client1'


;WITH E AS (
    SELECT
        Client,
        MIN(event) AS FirstEvent
    FROM #EVENTS
    GROUP BY Client
)
,B AS (
    SELECT
        E.Client,
        E.FirstEvent,
        COUNT(*) AS Records,
        DATEDIFF(DAY, 0, c.event - E.FirstEvent) / 7 AS [weeks]     
    FROM #EVENTS c
    JOIN E ON E.Client = c.Client
    GROUP BY E.Client, E.FirstEvent, DATEDIFF(DAY, 0, c.event - E.FirstEvent) / 7
)
SELECT
    Client,
    DATEADD(WEEK, weeks, FirstEvent) AS [From],
    DATEADD(WEEK, weeks + 1, FirstEvent) AS [To],
    Records
FROM B
ORDER BY Client, weeks;

DROP TABLE #EVENTS

ただし、特定の週にレコードがない場合は、Records 値 0 を含む行を返す代わりに、その行を除外します。

編集:

なぜfor myDAYの代わりにを使用するのか疑問に思われる場合は、日曜日または月曜日が週の最初の日であるかどうかの問題を回避するためです。WEEKDATEDIFF

于 2012-04-10T11:37:47.010 に答える
0

これは、開始と終了の間の週数が 2048 未満の場合に機能するはずです。そうでない場合は、数値テーブルを使用することをお勧めします。

SELECT
client
,DATEADD(WK,(number * -1) -1,fromdate) as [from]
,DATEADD(WK,number * -1,fromdate) as [to]
,COUNT(client) as records
from #sample
LEFT OUTER JOIN (SELECT number FROM dbo.spt_values WHERE type = 'p') nums 
on nums.number <= DATEDIFF(WK,todate,fromdate)
GROUP BY client
,DATEADD(WK,(number * -1) -1,fromdate) 
,DATEADD(WK,number * -1,fromdate) 
ORDER BY 
client
,DATEADD(WK,(number * -1) -1,fromdate) DESC
于 2012-04-10T11:53:43.107 に答える