私は、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秒かかりました。努力は問題の分担です。
このロジックでは、レコードの順序が非常に重要になっているようです。注文をどのように決定しますか? – JNevill
私は方向を指示することはありませんか? – bilal
データの順序はどうですか?納品日は常に前の行よりも大きいですか?そうでない場合は、ID列またはデータのシーケンスを表す何かがありますか?おそらくMessageIdと同じですか? – scsimon