SQL

2017-10-06 1 views
1

に時間を計算する方法を私は順番に15分間隔であることを(日付は問われません)それはあり を時間間隔に基づいてフラグを作成する必要がある表は、このSQL

ID    DTTM 
123456789 2017-10-05 08:00:00.000 
123456789 2017-10-05 08:05:00.000 
123456789 2017-10-05 08:07:00.000 
123456789 2017-10-05 08:15:00.000 
123456789 2017-10-05 08:25:00.000 
123456789 2017-10-05 09:00:00.000 
123456789 2017-10-05 09:01:00.000 
123456789 2017-10-05 09:02:00.000 
123456789 2017-10-05 09:03:00.000 
123456789 2017-10-05 11:00:00.000 

のように見えていフラグを1に設定する この場合、行1,4,6,10はフラグになり、このIDの合計は4になります interval >= 15 minutesが次の1になるまで再開するたびに 試しましたこのようなもの;

(
Select  top 100 percent 
      ID, 
      DTTM,     
      LEAD(DTTM,1) over (partition by ID order by DTTM) as NextDTTM 
From  Example 
Order by ID 
), myCount 
AS 
(
Select  Top 100 percent 
      ID, 
      DTTM, 
      NextDTTM, 
      DateDiff("MINUTE",DTTM,NextDTTM) as Interval 
from  myLead 
) 
Select  ID, 
      DTTM, 
      NextDTTM, 
      Interval, 
      Case When Interval >= 15 then 1 else 0 END as CountFlag 
From  myCount 
Where  Interval is not NULL 
Order by ID 

AS myLeadで しかし、期待どおりに動作しますか?どのように私はこれを解決するのですか?

おかげで、 オデッドドロール

答えて

0

値外見は似ていますが、SQL Server 2012を使用すると2つのトリッキーな部分になります。まず、次と前の行の間の時間差を取得する。そして、

DECLARE @DataSource TABLE 
(
    [ID] BIGINT 
    ,[DTTM] DATETIME2 
); 

INSERT INTO @DataSource ([ID], [DTTM]) 
VALUES (123456789, '2017-10-05 08:00:00.000') 
     ,(123456789, '2017-10-05 08:05:00.000') 
     ,(123456789, '2017-10-05 08:07:00.000') 
     ,(123456789, '2017-10-05 08:15:00.000') 
     ,(123456789, '2017-10-05 08:25:00.000') 
     ,(123456789, '2017-10-05 09:00:00.000') 
     ,(123456789, '2017-10-05 09:01:00.000') 
     ,(123456789, '2017-10-05 09:02:00.000') 
     ,(123456789, '2017-10-05 09:03:00.000') 
     ,(123456789, '2017-10-05 11:00:00.000'); 

SELECT * 
     ,DATEDIFF(MINUTE,CONVERT(TIME, [DTTM]),LEAD(CONVERT(TIME, [DTTM]), 1, NULL) OVER (PARTITION BY [ID] ORDER BY [DTTM])) AS [Minutes] 
FROM @DataSource 
ORDER BY [DTTM]; 

enter image description here

を、我々は現在の行にオーバー間隔の物乞いから分をsum15にそれらを分割する必要があります。

WITH DataSource AS 
(
    SELECT * 
      ,DATEDIFF(MINUTE,LAG(CONVERT(TIME, [DTTM]), 1, NULL) OVER (PARTITION BY [ID] ORDER BY [DTTM]), CONVERT(TIME, [DTTM])) AS [Minutes] 
    FROM @DataSource 
) 
SELECT * 
     ,SUM(ISNULL([Minutes], 0)) OVER (PARTITION BY [ID] ORDER BY [DTTM] ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)/15 AS [MinutesRank] 
FROM DataSource; 

enter image description here

これを持って、あなたはあなたがNE何でも行うことができます私たちは各行まで何分を持っているかのようになりました。たとえば:

WITH DataSource AS 
(
    SELECT * 
      ,DATEDIFF(MINUTE,LAG(CONVERT(TIME, [DTTM]), 1, NULL) OVER (PARTITION BY [ID] ORDER BY [DTTM]), CONVERT(TIME, [DTTM])) AS [Minutes] 
    FROM @DataSource 
) 
, DataSourceMinutesTotal AS 
(
    SELECT * 
      ,SUM(ISNULL([Minutes], 0)) OVER (PARTITION BY [ID] ORDER BY [DTTM] ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)/15 AS [MinutesRank] 
    FROM DataSource 
) 
SELECT [ID], [DTTM] 
     ,DENSE_RANK() OVER (PARTITION BY [ID] ORDER BY ISNULL([MinutesRank], 0)) AS [IntervalID] 
FROM DataSourceMinutesTotal 
ORDER BY [DTTM]; 

enter image description here

+0

Gotqn、 ご協力いただきありがとうございます。問題は既に解決されています。このソリューションは、私が探していた結果を提供しません。 –

0

あなたはMySQLのを使用する場合は、あなたがTIMEDIFF(param1, param2) を使用して試すことができます* PARAM1およびPARAM2回または日付時刻することができ、私はあなたがするフラグを必要があるかわからない

+0

は問題がソール、私にお問い合わせいただきありがとうございます。あなたのアプローチは問題を解決しませんでした。 –