समाधान
इष्टतम की परिभाषा अलग-अलग हो सकते हैं, लेकिन यहां बताया गया है कि नियमित ट्रांजैक्ट एसक्यूएल का उपयोग करके विभिन्न पंक्तियों से स्ट्रिंग्स को कैसे जोड़ा जाए, जो कि Azure में ठीक काम करना चाहिए।
;WITH Partitioned AS
(
SELECT
ID,
Name,
ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Name) AS NameNumber,
COUNT(*) OVER (PARTITION BY ID) AS NameCount
FROM dbo.SourceTable
),
Concatenated AS
(
SELECT
ID,
CAST(Name AS nvarchar) AS FullName,
Name,
NameNumber,
NameCount
FROM Partitioned
WHERE NameNumber = 1
UNION ALL
SELECT
P.ID,
CAST(C.FullName + ', ' + P.Name AS nvarchar),
P.Name,
P.NameNumber,
P.NameCount
FROM Partitioned AS P
INNER JOIN Concatenated AS C
ON P.ID = C.ID
AND P.NameNumber = C.NameNumber + 1
)
SELECT
ID,
FullName
FROM Concatenated
WHERE NameNumber = NameCount
व्याख्या
दृष्टिकोण तीन चरणों तक उबलता है:
-
OVER
. का उपयोग करके पंक्तियों को क्रमांकित करें औरPARTITION
संयोजन के लिए आवश्यकतानुसार उन्हें समूहबद्ध और क्रमबद्ध करना। परिणामPartitioned
है सीटीई। हम बाद में परिणामों को फ़िल्टर करने के लिए प्रत्येक विभाजन में पंक्तियों की संख्या रखते हैं। -
पुनरावर्ती CTE का उपयोग करना (
Concatenated
) पंक्ति संख्याओं के माध्यम से पुनरावृति करें (NameNumber
कॉलम)Name
जोड़नाFullName
. के मान स्तंभ। -
उच्चतम
NameNumber
वाले परिणामों को छोड़कर सभी परिणामों को फ़िल्टर करें ।
कृपया ध्यान रखें कि इस क्वेरी को पूर्वानुमेय बनाने के लिए दोनों समूहों को परिभाषित करना होगा (उदाहरण के लिए, आपके परिदृश्य में समान ID
वाली पंक्तियों में) संयोजित हैं) और छँटाई (मैंने मान लिया था कि आप केवल संयोजन से पहले वर्णानुक्रम में स्ट्रिंग को क्रमबद्ध करते हैं)।
मैंने निम्न डेटा के साथ SQL Server 2012 पर समाधान का त्वरित परीक्षण किया है:
INSERT dbo.SourceTable (ID, Name)
VALUES
(1, 'Matt'),
(1, 'Rocks'),
(2, 'Stylus'),
(3, 'Foo'),
(3, 'Bar'),
(3, 'Baz')
क्वेरी परिणाम:
ID FullName
----------- ------------------------------
2 Stylus
3 Bar, Baz, Foo
1 Matt, Rocks