sql server - एकाधिक वैल्यू के साथ कॉलम द्वारा टीएसक्यूएल ग्रुप




sql-server tsql (2)

मेरे पास SQLServer 2008r2 में एक तालिका है

मैं सभी रिकॉर्ड का चयन करना चाहता हूं जहां [Fg] column = 1 को लगातार [Id] क्रम से प्रत्येक [T_Id] और [N_Id] संयोजन के लिए मान 2 में ले जाना चाहिए।

ऐसे उदाहरण हो सकते हैं जहां पहले [Fg] = 2 के रिकॉर्ड नहीं = 1 नहीं करता है

इसमें कोई भी रिकॉर्ड हो सकता है जहां [Fg] = 1 का मान है, लेकिन केवल एक रिकॉर्ड जहां प्रत्येक [T_Id] और [N_Id] संयोजन के लिए [Fg] = 2।

इसलिए नीचे दिए गए उदाहरण के लिए, मैं [Id] एस (4,5) और (7,8,9) और (1 9, 20) के साथ रिकॉर्ड चुनना चाहता हूं।

[T_Id] 3 और 4 के लिए कोई अभिलेख शामिल नहीं है [T_Id]

अपेक्षित उत्पादन

उदाहरण डेटा सेट

DECLARE @Data TABLE ( Id INT IDENTITY (1,1), T_Id INT, N_Id INT, Fg TINYINT )

INSERT INTO @Data
(T_Id, N_Id, Fg)
VALUES
(1, 2, 0), (1, 2, 1), (1, 2, 0), (1, 2, 1), (1, 2, 2), (2, 3, 0), (2, 3, 1), 
(2, 3, 1), (2, 3, 2), (3, 4, 0), (3, 4, 0), (3, 4, 0), (3, 4, 2), (4, 5, 0), 
(4, 5, 1), (4, 5, 0), (4, 5, 2), (5, 7, 0), (5, 7, 1), (5, 7, 2) 

आप लैग / लीड का उपयोग नहीं कर सकते हैं क्योंकि यह एसक्यूएल 2012 में शुरू हुआ, आपको नीचे की तरह कुछ करना होगा।

SELECT  fg - (
        SELECT  TOP 1 fg
        FROM    table m2
        WHERE   m2.fg = m1.fg-1 OR (m2.fg = m1.fg AND m2.id < m1.id)
        ORDER BY 
                fg, id
        )
FROM table m1
ORDER BY
      fg, id

यह recursive CTE का उपयोग करके आसानी से किया जा सकता है:

WITH DataSource AS
(
    SELECT DS1.*
    FROM @Data DS1
    INNER JOIN @Data DS2
        ON DS1.[T_Id] = DS2.[T_Id]
        AND DS1.[N_Id] = DS2.[N_Id]
        AND DS1.[Id] = DS2.[Id] + 1
        AND DS1.[Fg] = 2
        AND DS2.[Fg] = 1
    UNION ALL
    SELECT DS1.*
    FROM @Data DS1
    INNER JOIN DataSource DS2
        ON DS1.[T_Id] = DS2.[T_Id]
        AND DS1.[N_Id] = DS2.[N_Id]
        AND DS1.[Id] = DS2.[Id] - 1
        AND DS1.[Fg] = 1
)
SELECT *
FROM DataSource
ORDER BY Id

विचार सरल है क्वेरी के पहले भाग को fg = 2 साथ सभी valid रिकॉर्ड मिलते हैं - मान्य अर्थ है कि इस समूह के fg = 1 साथ पहले एक रिकॉर्ड है।

फिर पुनरावृत्त भाग में हम सभी अभिलेख छोटे होते हैं, प्रारंभिक लोग, जो कि fg = 1





sql-server-2008-r2