2011-09-29 14 views
6

मैं SQL सर्वर 2008 का उपयोग कर रहा हूं;कई कॉलम के बीच न्यूनतम मान प्राप्त करें

मान लीजिए कि मेरे पास कॉलम 'डेट 1', 'डेट 2', 'डेटब्लैह', सभी प्रकार डेटटाइम के साथ एक टेबल 'एक्स' है।

मैं तीन स्तंभों के बीच न्यूनतम मूल्य का चयन करने के लिए, उदाहरण (सरलीकृत, तिथि मिमी के साथ/dd/yyyy) के लिए

ID  Date1   Date2   Dateblah 
0  09/29/2011  09/20/2011  09/01/2011 
1  01/01/2011  01/05/2011  03/03/2010 

ID MinDate 
0 09/01/2011 
1 03/03/2010 

वहाँ ऐसा करने के लिए रोटी और मक्खन आदेश है करना चाहते हैं?

अग्रिम धन्यवाद।

संपादित करें: मैंने यह प्रश्न What's the best way to select the minimum value from several columns? देखा है लेकिन दुर्भाग्यवश यह मेरे अनुरूप नहीं होगा क्योंकि मुझे सामान्यीकरण के खिलाफ ऐसा करने के लिए बाध्य किया जा रहा है क्योंकि मैं tfs कार्य आइटम रिपोर्ट बना रहा हूं, और 'ब्रूट-फोर्स' केस अगर मेरे पास 6 कहां 7 कॉलम हैं तो चीज दर्द हो जाएगी।

उत्तर

5

न्यूनतम/अधिकतम दो (या अधिक) कॉलम को वापस करने के लिए फ़ंक्शन में कोई अंतर्निहित नहीं है। ऐसा करने के लिए आप अपना खुद का स्केलर फ़ंक्शन लागू कर सकते हैं।

एसक्यूएल सर्वर 2005+ आप पंक्तियों में स्तंभों की बारी है और फिर मिन समारोह का उपयोग करने के UNPIVOT इस्तेमाल कर सकते हैं में:

CREATE TABLE [X] 
(
    [ID] INT, 
    [Date1] DATETIME, 
    [Date2] DATETIME, 
    [Date3] DATETIME 
) 

INSERT [X] 
VALUES (0, '09/29/2011', '09/20/2011', '09/01/2011'), 
     (1, '01/01/2011', '01/05/2011', '03/03/2010') 


SELECT [ID], MIN([Date]) AS [MinDate] 
FROM [X] 
UNPIVOT (
    [Date] FOR d IN 
     ([Date1] 
     ,[Date2] 
     ,[Date3]) 
) unpvt 
GROUP BY [ID] 
+0

धन्यवाद, यह पूरी तरह से काम करता है, जैसा कि मैंने –

+0

मैं बस अपना सर्वर (एसक्यूएल सर्वर 2008 R2) पर इस कोड को भागने की कोशिश की है और पिछले बयान से संबंधित कोई त्रुटि प्राप्त कर सकते हैं मैं जितनी जल्दी जवाब के रूप में चिह्नित कर देंगे । "तिथि 'के पास गलत वाक्यविन्यास।" –

+0

मुझे यकीन नहीं है कि आपको यह क्यों मिल रहा है। क्या आप एसक्यूएल सर्वर प्रबंधन स्टूडियो के माध्यम से स्क्रिप्ट चला रहे हैं? मैंने अभी 2008 के आर 2 इंस्टेंस के खिलाफ फिर कोशिश की है और यह मेरे लिए ठीक काम करता है .. –

1

एक अदिश समारोह को लागू करने:

CREATE FUNCTION [dbo].[MIN](@a SQL_VARIANT, @b SQL_VARIANT) 
RETURNS SQL_VARIANT 
AS 
BEGIN 
    RETURN (
     SELECT MIN([x]) 
     FROM (VALUES(@a),(@b)) x([x]) 
    ) 
END 
GO 

DECLARE @a DATETIME = '12 JUL 2011', @b DATETIME = '20 AUG 2011' 
SELECT [dbo].[MIN](@a, @b) 

DECLARE @c INT = 12, @d INT = 32 
SELECT [dbo].[MIN](@c, @d) 
8

अदिश कार्य के आधार पर (Tom Hunter से):

SELECT ID, (SELECT MIN([date]) FROM (VALUES(Date1),(Date2),(Dateblah)) x([date])) MinDate 
FROM TableName 
0

बस बस टा कहें ब्ली जहां आपकी तिथियां sells कहलाती हैं और इसमें दो दिनांक फ़ील्ड Date1 और Date2 हैं, जिनसे आप न्यूनतम चाहते हैं।

SELECT ( 
    SELECT MIN([x]) 
    FROM (VALUES(Date1),(Date2)) x([x]) 
) as minimum 
FROM sells 
संबंधित मुद्दे