2017-09-22 16 views
0

私は、deleieverddddateが保存されているテーブルを持っています。配信された日付の一部がnullであり、それらのいくつかは、delieveされた日付がnullであるカウントを計算したいそれらの間に欠けている人。Sqlの計算値が列の値よりも大きい

deleievered date 

NULL 
NULL 
NULL 

カウントは3

すなわちなければなりません

すなわち

NULL 
NULL 
9/22/2017 
NULL 
10/22/2017 
NULL 

カウント1 ここでは、以前のすべてのdeievered日は私が持っている

nullでなく、スキップする必要がありますこれを試したが、それは高価すぎる。

DECLARE @myTable TABLE 
    (
     MessageId BIGINT , 
     ReceiverID VARCHAR(100) 
    ) 

DECLARE @mySecondTable TABLE 
    (
     MessageId BIGINT , 
     ReceiverID VARCHAR(100), 
     DeliveredDate DATETIME 
    ) 


DECLARE @myLastTable TABLE 
    (
     MessageId BIGINT , 
     ReceiverID VARCHAR(100) 
    ) 





INSERT INTO @myTable 
     (MessageId , 
      ReceiverID 

     ) 
     SELECT MAX(MessageID) , 
       ReceiverID 
     FROM dbo.CM_MessageStatus 
     WHERE ReceiverID IN (SELECT * 
           FROM string_split(@UserID, ',')) 
       AND DeliveredDate IS NOT NULL 
     GROUP BY ReceiverID 






INSERT INTO @mySecondTable 
     (MessageId , 
      ReceiverID, 
      DeliveredDate 

     ) 

SELECT CM_MessageStatus.MessageID, 
     dbo.CM_MessageStatus.ReceiverID, 
     DeliveredDate 
FROM dbo.CM_MessageStatus 
WHERE DeliveredDate IS NULL AND 

     ReceiverID IN (SELECT * 
          FROM string_split(@UserID, ',')) 
--GROUP BY dbo.CM_MessageStatus.ReceiverID,DeliveredDate 




--Now check each userid 
declare @ReceiverID NVARCHAR(MAX) 
while exists (select * from @mySecondTable) 
BEGIN 

      select top 1 @ReceiverID = ReceiverID 
      from @mySecondTable 
      order by ReceiverID ASC 





     IF EXISTS(SELECT * FROM @myTable WHERE [email protected]) 
     BEGIN 
          INSERT INTO @myLastTable 
            (MessageId , 
             ReceiverID 

            ) 


            SELECT MessageID, 
              @ReceiverID 
            FROM @mySecondTable 
            WHERE DeliveredDate IS NULL 
              AND MessageId > (SELECT 
                 MessageId 
                 FROM 
                 @myTable 
                 WHERE 
                 ReceiverID = @ReceiverID 
                ) 
                 AND [email protected] 
                 --GROUP BY ReceiverID 
     END 


     ELSE 
     BEGIN 
       INSERT INTO @myLastTable 
            (MessageId , 
             ReceiverID 

            ) 
            SELECT MessageID , 
              ReceiverID 
            FROM @mySecondTable 
            WHERE DeliveredDate IS NULL 
            AND [email protected] 
     END 


     delete @mySecondTable 
     where ReceiverID = @ReceiverID 
END 

    SELECT COUNT(MessageId) AS MessageId,ReceiverID FROM @myLastTable 
    GROUP BY ReceiverID 

これはあまりにも高価ですが、どのように私は1つの選択肢でこれを行うことができます80万のために35秒かかりました。努力は問題の分担です。

+0

このロジックでは、レコードの順序が非常に重要になっているようです。注文をどのように決定しますか? – JNevill

+0

私は方向を指示することはありませんか? – bilal

+0

データの順序はどうですか?納品日は常に前の行よりも大きいですか?そうでない場合は、ID列またはデータのシーケンスを表す何かがありますか?おそらくMessageIdと同じですか? – scsimon

答えて

0

さて、あなたはデータを注文する必要があります。つまり、ID列、または他のすべての行と比較して行が挿入された時期を表すものです。この例では、MessageIDを使用します。行が挿入されるたびに、新しいMessageIDが取得されます。新しいMessageIDは、前の値よりも1大きい値です。いくつかの列(日付挿入)またはPrimaryKey/Auto Increment列がなければ、これは不可能です。だから、もしあなたがそれを持っていれば、あなたがそれをやる方法はここにあります。

declare @table table (MessageId int identity(1,1), dt date) 
insert into @table 

values 
(NULL), 
(NULL), 
('9/22/2017'), 
(NULL), 
('10/22/2017'), 
(NULL) 



select 
    count(*) 
from 
    @table 
where 
    --limits rows to the last one where data is not null 
    MessageID > (
    select max(MessageID) 
    from @table 
    where dt is not null) 
or 
    --if all dates are null 
    (
    select max(dt) 
    from @table) is null 
+0

あなたの解決策は、私はすべてのcommasepratedユーザとReceiverID IN(かどうかを確認する必要があり、テーブルの私が持っている最後の行のために行く '123456789を(@UserID、」、') DECLARE @UserID NVARCHAR(MAX)string_split * FROM を選択します= 、10 ' – bilal

+0

あなたは元の投稿では言いませんでしたが、where節でこれを行うことができます.....そして、各ユーザーのtitカウントが必要な場合は、グループによる。あなたは手の込んだする必要があります。 は、データがNULLでない最後の1に行を--limitsどこ – scsimon

+0

が からdbo.CM_MessageStatus を 数(*) を選択 MessageStatusID>( 選択最大(MessageStatusID)すべての日付--if DeliveredDateがNULLでないdbo.CM_MessageStatus とReceiverID IN( '4284924b43ee473580a01eb000f78e82') \t) または から0がDBOから ( 選択最大(DeliveredDate) nullです。CM_MessageStatus \t ReceiverID IN( '4284924b43ee473580a01eb000f78e82') \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \tが) – bilal

関連する問題