में दिनांकों का समूह चुनना मेरे पास एक इतिहास तालिका है जो किसी निश्चित ऑब्जेक्ट के अपडेट को कैप्चर करती है और, अन्य जानकारी के अतिरिक्त, यह अद्यतन उस समय को कैप्चर करता है। मैं क्या करना चाहता हूं SELECT
MIN(LogDate)
एक निश्चित ActionTaken
कॉलम से संबंधित है।SQL सर्वर
अधिक विशेष रूप से, इतिहास तालिका अन्य (नवीनतम) पंक्तियों जहां ActionTaken = 1
हो सकता है, लेकिन मैं तारीख ActionTaken
बन 1.
उदाहरण कैप्चर करना चाहते हैं:
SELECT MIN(LogDate) AS FirstActionDate
FROM HistoryTable
WHERE ID = 123
AND FirstActionTaken = 1
SELECT MIN(LogDate) AS SecondActionDate
FROM HistoryTable
WHERE ID = 123
AND SecondActionTaken = 1
SELECT MIN(LogDate) AS ThirdActionDate
FROM HistoryTable
WHERE ID = 123
AND ThirdActionTaken = 1
यह अच्छी तरह से काम करता है , और मुझे बिना किसी मुद्दे के उचित तिथियां मिलती हैं। मैं कहां से मुसीबत में चल रहा हूँ तो इस समूह से MAX(LogDate)
select
जा रहा है:
SELECT MAX(LogDate) AS LastActionDate
FROM HistoryTable
WHERE ID = 123
AND LogDate IN
(
( SELECT MIN(LogDate) AS FirstActionDate
FROM HistoryTable
WHERE ID = 123
AND FirstActionTaken = 1 ),
( SELECT MIN(LogDate) AS SecondActionDate
FROM HistoryTable
WHERE ID = 123
AND SecondActionTaken = 1 ),
( SELECT MIN(LogDate) AS ThirdActionDate
FROM HistoryTable
WHERE ID = 123
AND ThirdActionTaken = 1 )
)
यह भी काम करता है, लेकिन मैं इसे इस तरह से कर रही नफरत है। मैं पिछले बयान को चर में सहेज सकता हूं और उनसे केवल SELECT MAX()
; यह निश्चित रूप से अधिक पठनीय होगा, लेकिन JOIN
वाक्यविन्यास इस क्वेरी के लिए कैसा दिखता है?
क्या पहले तीन SELECT
कथनों को एक साथ जोड़ने का कोई तरीका है जो सभी तीन तिथियों को लौटाता है और एक अपठनीय गड़बड़ नहीं है?
मैं कैसे प्राप्त कर सकते हैं सबसे हाल ही में LogDate
इस परिणाम की स्थापना की और (उचित रूप में अनावश्यक) के बिना SELECT
बयान दोहरा से (एक अलग कॉलम के रूप में)?
संपादित करें:
- Data Normalization
- Using
OUTER/CROSS APPLY
UNPIVOT
(और दूसरों:यहाँ कुछ लिंक मैं जवाब है कि अब तक दिया गया है के संबंध में प्राप्त होते हैं)
हो दृढ़ता से यह दूसरों के साथ समान समस्याओं के समाधान की तलाश में मदद करेगा!
यूनियन का उपयोग करें और फिर आप – JamieD77