यहाँ एक छद्म UNPIVOT संस्करण आप निर्दिष्ट कर सकते हैं कि कॉलम का क्रम (यदि कॉलम नाम उनकी स्थिति से क्रमबद्ध नहीं होते हैं)।
SELECT
T.ID,
X.Name
FROM
T
CROSS APPLY (
SELECT TOP 1 Name FROM (
VALUES (1, 'A1', T.A1), (2, 'A2', T.A2), (3, 'A3', T.A3), (4, 'A4', T.A4),
(5, 'A5', T.A5), (6, 'A6', T.A6), (7, 'A7', T.A7), (8, 'A8', T.A8),
(9, 'A9', T.A9)
) X (Pos, Name, Col)
WHERE Col IS NOT NULL
ORDER BY X.Pos DESC
) X;
हालांकि, जबकि वास्तविक आईओ और सीपीयू हैं प्राकृतिक UNPIVOT विधि की तुलना में बहुत खराब नहीं (कार्य योजना लागू करके बुरा लग रहा है, लेकिन असली सर्वर प्रभाव है कि बहुत खराब नहीं है), यह सबसे अच्छा कलाकार नहीं है। @pst द्वारा दी गई सरल केस अभिव्यक्ति है।
स्तंभ नाम है के रूप में हल हो सकता है मान लिया जाये कि, UNPIVOT और भी अधिक सरल किया जा सकता:
SELECT ID, Max(Last)
FROM T UNPIVOT (Value FOR Last IN (A1, A2, A3, A4, A5, A6, A7, A8, A9)) U
GROUP BY ID;
अंत में, यहाँ एक पागल संस्करण मुझे लगता है कि दुर्भाग्य से दूसरों की तुलना में खराब प्रदर्शन करने के बारे में सोचा है:
SELECT
T.ID,
Coalesce(
(SELECT 'A9' WHERE T.A9 IS NOT NULL),
(SELECT 'A8' WHERE T.A8 IS NOT NULL),
(SELECT 'A7' WHERE T.A7 IS NOT NULL),
(SELECT 'A6' WHERE T.A6 IS NOT NULL),
(SELECT 'A5' WHERE T.A5 IS NOT NULL),
(SELECT 'A4' WHERE T.A4 IS NOT NULL),
(SELECT 'A3' WHERE T.A3 IS NOT NULL),
(SELECT 'A2' WHERE T.A2 IS NOT NULL),
(SELECT 'A1' WHERE T.A1 IS NOT NULL)
) LastNotNullColumn
FROM T
ORDER BY ID
सैद्धांतिक रूप से, इंजन एक ऐसी योजना के साथ आ सकता है जो CASE अभिव्यक्ति संस्करण की तरह बहुत अधिक दिखता है, लेकिन ऐसा नहीं है। यह योजना बिल्कुल चुनिंदा दिखती है, एक टेबल ऑब्जेक्ट प्रति चयन कथन के साथ, और CASE अभिव्यक्ति के रूप में लगभग दो बार CPU लेता है।
परीक्षण किए गए सभी संस्करणों में लॉजिकल रीड की एक ही संख्या का उपयोग होता है, केवल सीपीयू में भिन्न होता है। मैंने परीक्षण करने के लिए 15,000 पंक्तियों का उपयोग किया।
आखिरकार, मैं अच्छी विवेक में नहीं हूं, आपको चेतावनी नहीं देता कि आपकी स्कीमा शायद सबसे अच्छी नहीं है। जबकि मैं यह नहीं बता सकता कि आपका डेटा क्या है, कि आप आखिरी बार खोजने की कोशिश कर रहे हैं शायद कॉलम कुछ जीवन चक्र के समय या चरणों का प्रतिनिधित्व करता है - और यह सही डेटाबेस डिज़ाइन नहीं है। इसके बजाय, डेटा unpivoted स्टोर करें। जब समय आता है कि आपको एक परिणाम सेट की आवश्यकता है जिसे पिवोट किया गया है, तो आप PIVOT कर सकते हैं। और, प्रति आईडी सबसे हालिया मूल्य के लिए पूछताछ थोड़ा आसान हो जाता है!
क्या मैं कह सकता हूं "वह स्कीमा भयानक लगती है"? :-) यह एक रिवर्स-प्राथमिकता सशर्त के साथ किया जा सकता है। –