प्रदर्शन विस्तार के लिए अपने ब्लॉग में इन लेखों देखें:
नीचे क्वेरी के लिए मुख्य विचार है कि हम सभी को नष्ट करना चाहिए अंतराल की निरंतर श्रृंखला से भी पंक्तियां।
यही है, अगर दिया के लिए (unitId, Day)
हम निम्नलिखित intervals
है:
1
2
3
4
6
7
8
9
, हम दो निरंतर पर्वतमाला है:
1
2
3
4
और
6
7
8
9
, और हम ऐसा करना चाहिए हर पंक्ति को भी हटाएं:
1
2 -- delete
3
4 -- delete
और
6
7 -- delete
8
9 -- delete
, ताकि हम पाते हैं:
1
3
6
8
ध्यान दें कि "यहां तक कि पंक्तियों" का अर्थ है "भी प्रति-सीमा ROW_NUMBER()
रों" यहाँ, नहीं "भी interval
के मूल्यों "।
क्वेरी है:
DECLARE @Table TABLE (ID INT, UnitID INT, [Day] INT, Interval INT, Amount FLOAT)
INSERT INTO @Table VALUES (1, 100, 10, 21, 9.345)
INSERT INTO @Table VALUES (2, 100, 10, 22, 9.345)
INSERT INTO @Table VALUES (3, 200, 11, 21, 9.345)
INSERT INTO @Table VALUES (4, 300, 11, 21, 9.345)
INSERT INTO @Table VALUES (5, 300, 11, 22, 9.345)
INSERT INTO @Table VALUES (6, 300, 11, 23, 9.345)
INSERT INTO @Table VALUES (7, 400, 13, 21, 9.345)
INSERT INTO @Table VALUES (8, 400, 13, 22, 9.345)
INSERT INTO @Table VALUES (9, 400, 13, 23, 9.345)
INSERT INTO @Table VALUES (10, 400, 13, 24, 9.345)
INSERT INTO @Table VALUES (11, 400, 13, 26, 9.345)
INSERT INTO @Table VALUES (12, 400, 13, 27, 9.345)
INSERT INTO @Table VALUES (13, 400, 13, 28, 9.345)
INSERT INTO @Table VALUES (14, 400, 13, 29, 9.345)
;WITH rows AS
(
SELECT *,
ROW_NUMBER() OVER
(
PARTITION BY
(
SELECT TOP 1 qi.id AS mint
FROM @Table qi
WHERE qi.unitid = qo.unitid
AND qi.[day] = qo.[day]
AND qi.interval <= qo.interval
AND NOT EXISTS
(
SELECT NULL
FROM @Table t
WHERE t.unitid = qi.unitid
AND t.[day] = qi.day
AND t.interval = qi.interval - 1
)
ORDER BY
qi.interval DESC
)
ORDER BY interval
) AS rnm
FROM @Table qo
)
DELETE
FROM rows
WHERE rnm % 2 = 0
SELECT *
FROM @table
अद्यतन:
यहाँ एक अधिक कुशल क्वेरी है:
DECLARE @Table TABLE (ID INT, UnitID INT, [Day] INT, Interval INT, Amount FLOAT)
INSERT INTO @Table VALUES (1, 100, 10, 21, 9.345)
INSERT INTO @Table VALUES (2, 100, 10, 22, 9.345)
INSERT INTO @Table VALUES (3, 200, 11, 21, 9.345)
INSERT INTO @Table VALUES (4, 300, 11, 21, 9.345)
INSERT INTO @Table VALUES (5, 300, 11, 22, 9.345)
INSERT INTO @Table VALUES (6, 300, 11, 23, 9.345)
INSERT INTO @Table VALUES (7, 400, 13, 21, 9.345)
INSERT INTO @Table VALUES (8, 400, 13, 22, 9.345)
INSERT INTO @Table VALUES (9, 400, 13, 23, 9.345)
INSERT INTO @Table VALUES (10, 400, 13, 24, 9.345)
INSERT INTO @Table VALUES (11, 400, 13, 26, 9.345)
INSERT INTO @Table VALUES (12, 400, 13, 27, 9.345)
INSERT INTO @Table VALUES (13, 400, 13, 28, 9.345)
INSERT INTO @Table VALUES (14, 400, 13, 29, 9.345)
;WITH source AS
(
SELECT *, ROW_NUMBER() OVER (PARTITION BY unitid, day ORDER BY interval) rn
FROM @Table
),
rows AS
(
SELECT *, ROW_NUMBER() OVER (PARTITION BY unitid, day, interval - rn ORDER BY interval) AS rnm
FROM source
)
DELETE
FROM rows
WHERE rnm % 2 = 0
SELECT *
FROM @table
मैं सकारात्मक नहीं हूँ, लेकिन एक सेट है कि मैं क्या सेट सिद्धांत से याद से "निकटता" को नहीं समझता। इसे कर्सर के साथ करने की आवश्यकता हो सकती है। –
आप कैसे तय करते हैं कि कौन सी पंक्तियां हटाना है? क्या फ़ील्ड (ओं) के आधार पर मानदंड क्या है? –
यह कुंजी के आधार पर "क्रमिक क्रम" प्रतीत होता है। –