2016-07-12 16 views
0

私は複数のdatetimeの列を持っています。 SQL Server 2008でタイムスタンプごとに計算する必要があります。同じ列のdatetimeスタンプの数は、datetimeスタンプのサイズよりも小さくなります。日付をカウントして同時に比較するSQL Server 2008

例:2016-05-01 14:24:000.00(列)DateTime1DateTime1列には、いくつのdatetime値が小さいかを計算する必要があります。

DateTime23の同じレコード(同じ行にある)のdatetime stampよりも小さいdatetimestampの数も知る必要があります。

DateTime1     DateTime2     DateTime3 
---------------------------------------------------------------------------- 
2016-05-01 13:24:000.00 2016-05-01 15:24:000.00 2016-05-01 16:20:000.00 
2016-05-01 13:30:000.00 2016-05-01 14:21:000.00 2016-05-01 15:10:000.00 
2016-05-01 14:24:000.00 2016-05-01 17:21:000.00 2016-05-01 18:10:000.00 
+0

編集あなたの質問をし、サンプルの結果を提供します。 は、その後、私はあなたの要求のためのクエリを持っています。 –

答えて

0

私が正しく理解していれば、あなたはrank()を使用することができます。

select t.*, 
     rank() over (order by datetime1) as dt1_rank, 
     rank() over (order by datetime2) as dt2_rank, 
     rank() over (order by datetime3) as dt3_rank 
from t ; 

あなたが結ばれた値をどのように処理するかに応じて、あなたが実際にdense_rank()をお勧めします。また、ランキング値から1を引いた値にすることもできます。

0

テーブル名[TestTB]に3列のDateTime1、DateTime2、DateTime3があるとします。 私はCountSmallerDateTime1を「DateTime1列の中でdatetime値がどれくらい小さいか」と答えました CountSmallerDateTime2は「DateTime2列の同じレコードの同じレコードのdatetimeスタンプよりもいくつのdatetimestampsが小さいか」という類似度、 DateTime3のCountSmallerDateTime3。

SELECT [DateTime1] 
    ,[DateTime2] 
    ,[DateTime3] 
    ,(SELECT COUNT(1) 
    FROM [TestTB] Sub 
    WHERE TB.[DateTime1] >Sub.[DateTime1]) AS CountSmallerDateTime1 
    ,(
    CASE WHEN TB.[DateTime2] > TB.[DateTime1] AND TB.[DateTime2] > TB.[DateTime3] THEN 
     2 
     WHEN ((TB.[DateTime2] <= TB.[DateTime1] AND TB.[DateTime2] > TB.[DateTime3]) 
      OR (TB.[DateTime2] > TB.[DateTime1] AND TB.[DateTime2] <= TB.[DateTime3])) THEN 
      1 
    ELSE 
     0 
    END 
) AS CountSmallerDateTime2, 
    (
    CASE WHEN TB.[DateTime3] > TB.[DateTime1] AND TB.[DateTime3] > TB.[DateTime2] THEN 
     2 
     WHEN ((TB.[DateTime3] <= TB.[DateTime1] AND TB.[DateTime3] > TB.[DateTime2]) 
      OR (TB.[DateTime3] > TB.[DateTime1] AND TB.[DateTime3] <= TB.[DateTime2])) THEN 
      1 
    ELSE 
     0 
    END 
) AS CountSmallerDateTime3 FROM [TestTB] TB 
0
;WITH CTE(DATE1, DATE2, DATE3,RN) 
AS 
(
SELECT CONVERT(DATETIME , '2016-05-01 13:24:000.00'), CONVERT(DATETIME,'2016-05-01 15:24:000.00'), CONVERT(DATETIME,'2016-05-01 16:20:000.00'),1 
UNION ALL 
SELECT CONVERT(DATETIME , '2016-05-01 13:30:000.00'), CONVERT(DATETIME,'2016-05-01 14:21:000.00'), CONVERT(DATETIME,'2016-05-01 15:10:000.00'),2 
UNION ALL 
SELECT CONVERT(DATETIME , '2016-05-01 14:24:000.00'), CONVERT(DATETIME,'2016-05-01 17:21:000.00'), CONVERT(DATETIME,'2016-05-01 18:10:000.00'),3 
) 
SELECT  RANK() OVER (ORDER BY DATE1) -1 AS SAME_COLUMN_DATE1 
     , RANK() OVER (ORDER BY DATE2) -1 AS SAME_COLUMN_DATE2 
     , RANK() OVER (ORDER BY DATE3) -1 AS SAME_COLUMN_DATE3 

     , CASE WHEN RN=1 AND DATE1< DATE2 AND DATE1<DATE3 THEN 0 
       WHEN RN=1 AND DATE1< DATE2 AND DATE1>DATE3 THEN 1 
       WHEN RN=1 AND DATE1> DATE2 AND DATE1<DATE3 THEN 1 
       ELSE 2 
       SAME_ROW_1 

     , CASE WHEN RN=2 AND DATE2< DATE1 AND DATE2<DATE3 THEN 0 
       WHEN RN=2 AND DATE2< DATE1 AND DATE2>DATE3 THEN 1 
       WHEN RN=2 AND DATE2> DATE1 AND DATE2<DATE3 THEN 1 
       ELSE 2 
       END SAME_ROW_2 

     , CASE WHEN RN=3 AND DATE3< DATE1 AND DATE3<DATE2 THEN 0 
       WHEN RN=3 AND DATE3< DATE1 AND DATE3>DATE2 THEN 1 
       WHEN RN=3 AND DATE3> DATE1 AND DATE3<DATE2 THEN 1 
       ELSE 2 
       END SAME_ROW_3   
     FROM CTE ORDER BY RN