2010-10-29 12 views
5

मैंमुझे तालिका से कई उच्चतम मूल्य कैसे प्राप्त होते हैं?

id f1 
-------------- 
1 2000-01-01 
1 2001-01-01 
1 2002-01-01 
1 2003-01-01 

की तरह एक मेज है और मैं एक पंक्ति

CREATE TABLE Test 
(
    id INT NOT NULL, 
    f1 DATETIME NOT NULL, 
) 

INSERT INTO Test (id, f1) VALUES (1, '1/1/2000') 
INSERT INTO Test (id, f1) VALUES (1, '1/1/2001') 
INSERT INTO Test (id, f1) VALUES (1, '1/1/2002') 
INSERT INTO Test (id, f1) VALUES (1, '1/1/2003') 

SELECT T1.* FROM Test as T1 

में नवीनतम 3 दिनांकों कहना प्राप्त करना चाहते हैं हालांकि मैं नहीं कर रहा हूँ की तरह

  SELECT T1.*,T2.* 
      FROM Test AS T1 
LEFT OUTER JOIN Test AS T2 ON T1.id = T2.id AND (T2.f1 > T1.f1) 
+3

यह सब एक पंक्ति में क्यों होना चाहिए? केवल एक कॉलम होना बहुत आसान होगा। –

+1

मुझे लगता है कि उन्हें पंक्तियों के रूप में वापस करने के लिए और अधिक कॉलम के साथ 1 पंक्ति नहीं है। – dotariel

+0

क्या आपको प्रत्येक आईडी के लिए तीन नवीनतम तारीख की आवश्यकता है? (मैंने देखा है कि आपकी आईडी हमेशा 1) –

उत्तर

3

एसक्यूएल सर्वर में आप select top 3 * from Test order by f1 desc कर सकता है। अन्य डीबीएमएस की, इस तरह के MySql के limit रूप में इसी तरह posibilities है Oracle की rownum आदि

+0

यह काम नहीं करेगी। यह एक कॉलम में नवीनतम 3 तारीखें देगा। Maestro1024 एक पंक्ति में नवीनतम 3 तारीखों के लिए पूछ रहा है। – pavanred

3

कुछ की कोशिश कर रहा था सुनिश्चित करें कि उन्हें एक पंक्ति में कैसे प्राप्त किया जाए, आप इसके साथ शुरू कर सकते हैं:

SELECT * FROM Test ORDER BY f1 DESC LIMIT 3 

की तरह है कि आप एक परिणाम देना चाहिए:

id f1 
1 2003-01-01 
1 2002-01-01 
1 2001-01-01 

उन्हें एक ही पंक्ति में लाना है, हालांकि, थोड़ा और मुश्किल हो सकता है ...

2

आप ORDER BY, TOP और PIVOT का एक संयोजन, कम से कम SQL सर्वर पर के साथ ऐसा कर सकते हैं। ऐसा लगता है कि कई अन्य उत्तरों ने परिणाम को "एक पंक्ति पर" होने की आवश्यकता को अनदेखा कर दिया है।

0

आप टेबल को पिवोट करके पंक्ति में शीर्ष 3 तिथियां प्राप्त कर सकते हैं और शायद तारीखों को संयोजित कर सकते हैं यदि आप उन्हें पिवोटिंग के बाद एक कॉलम में चाहते हैं।

संपादित करें: यहां तालिका को पिवोट करने और पंक्ति में नवीनतम 3 तिथियां प्रदान करने के लिए एक प्रश्न है। लेकिन पिवट के लिए आपको तालिका में उपलब्ध डेटा को जानना होगा। मुझे लगा कि हम नवीनतम 3 तिथियों के लिए पूछताछ कर रहे हैं, इसलिए हम तारीख कॉलम के चारों ओर पिवट करने के लिए सटीक वैल्यू नहीं जान पाएंगे। तो सबसे पहले, मैंने नवीनतम 3 तारीखों को एक temp तालिका में पूछताछ की। फिर पंक्ति में नवीनतम 3 तिथियां प्राप्त करने के लिए row_number 1, 2 और 3 पर एक पिवट चलाया।

Select Top 3 * into #Temp from Test order by f1 desc 
अब

, ROW_NUMBER स्तंभ पर धुरी -

SELECT id,[3] as Latest,[2] as LatestMinus1,[1] as LatestMinus2 
FROM (
select ROW_NUMBER() OVER(ORDER BY f1) AS RowId,f1,id from #Temp) AS Src 
PIVOT (Max(f1) FOR RowId IN ([1],[2],[3])) AS pvt 

इस में जो परिणाम -

Id | Latest     |LatestMinus1    |LatestMinus2 
1 | 2003-01-01 00:00:00.000 | 2002-01-01 00:00:00.000 | 2001-01-01 00:00:00.000 

और, बेशक

drop table #Temp 
+0

संपादित करें: मेरे उत्तर में एक प्रश्न जोड़ा गया। – pavanred

+0

Analytics सभी डेटाबेस द्वारा समर्थित नहीं हैं - SQL सर्वर 2005+, ओरेकल 9i +, PostgreSQL 8.4 + ... लेकिन MySQL –

1

तुम क्या करने कोशिश कर रहे हैं पिवोट टेबल कहा जाता है, यहां एक लेख है कि कैसे करें यह कार्य करें:

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::NO::P11_QUESTION_ID:766825833740

भी, आप का उपयोग करता है, तो ओरेकल मैं द्वारा विशेष रूप से

0

इस बारे में क्या, विश्लेषणात्मक कार्यों पर विचार करेंगे PARTITION से अधिक?

SELECT T1.f1 as "date 1", T2.f1 as "date 2", T3.f1 as "date 3" 
    FROM (SELECT * 
     FROM `date_test` 
     ORDER BY `f1` DESC 
     LIMIT 1) AS T1, 
     (SELECT * 
     FROM `date_test` 
     ORDER BY `f1` DESC 
     LIMIT 1, 1) AS T2, 
     (SELECT * 
     FROM `date_test` 
     ORDER BY `f1` DESC 
     LIMIT 2, 1) AS T3 
; 

कौन सा आउटपुट:

+------------+------------+------------+ 
| date 1  | date 2  | date 3  | 
+------------+------------+------------+ 
| 2003-01-01 | 2002-01-01 | 2001-01-01 | 
+------------+------------+------------+ 

केवल नकारात्मक पक्ष यह है कि आप कम से कम तीन पंक्तियों की जरूरत है, अन्यथा यह कुछ भी वापस नहीं होगा ...

JOIN उपयोग करके, आप यह कर सकते हैं :

SELECT T1.id, 
     T1.f1 as "date 1", 
     T2.f1 as "date 2", 
     T3.f1 as "date 3" 
    FROM `date_test` as T1 
    LEFT JOIN (SELECT * FROM `date_test` ORDER BY `f1` DESC) as T2 ON (T1.id=T2.id AND T1.f1 != T2.f1) 
    LEFT JOIN (SELECT * FROM `date_test` ORDER BY `f1` DESC) as T3 ON (T1.id=T3.id AND T2.f1 != T3.f1 AND T1.f1 != T3.f1) 
GROUP BY T1.id 
ORDER BY T1.id ASC, T1.f1 DESC 

जो कुछ वापस लौटाएगा:

+----+------------+------------+------------+ 
| id | date 1  | date 2  | date 3  | 
+----+------------+------------+------------+ 
| 1 | 2001-01-01 | 2003-01-01 | 2002-01-01 | 
+----+------------+------------+------------+ 

नकारात्मक पक्ष यह है कि date1, date 2 और date 3 जरूरी एक विशेष क्रम में नहीं होगा (ऊपर नमूना उत्पादन के अनुसार) है। लेकिन यह प्रोग्रामिक रूप से हासिल किया जा सकता है। प्लस साइड यह है कि आप GROUP BY से पहले WHERE खंड डाल सकते हैं और उदाहरण के लिए आप T1.id से खोज सकते हैं।

1
T-SQL में

(यह सभी एक ही मूल्य है, भले ही वे कर रहे हैं आप शीर्ष तीन तारीखों मिल जाएगा)

with TestWithRowNums(f1, row_num) as 
(
select f1, row_number() over(order by [f1] desc) as row_num from test 
) 
select 
(select [f1] from TestWithRowNums where row_num = 1) as [Day 1], 
(select [f1] from TestWithRowNums where row_num = 2) as [Day 2], 
(select [f1] from TestWithRowNums where row_num = 3) as [Day 3] 

यह आपको शीर्ष तीन अलग तिथियों

with TestWithRankNums(f1, rank_num) as 
(
select f1, dense_rank() over(order by [f1] desc) as rank_num from test 
) 
select 
(select top 1 [f1] from TestWithRankNums where rank_num = 1) as [Day 1], 
(select top 1 [f1] from TestWithRankNums where rank_num = 2) as [Day 2], 
(select top 1 [f1] from TestWithRankNums where rank_num = 3) as [Day 3] 

कोशिश मिल जाएगा यह SQL सर्वर 2005

--to get top three values even if they are the same 
select [1] as Day1, [2] as Day2, [3] as Day3 from 
(select top 3 f1, row_number() over(order by [f1] desc) as row_num from test) src 
pivot 
(
max(f1) for row_num in([1], [2], [3]) 
) as pvt 
--to get top three distinct values 
select [1] as Day1, [2] as Day2, [3] as Day3 from 
(select f1, dense_rank() over(order by [f1] desc) as row_num from test) src 
pivot 
(
max(f1) for row_num in([1], [2], [3]) 
) as pvt 
+0

नहीं, मैं एमएस एसक्यूएल का उपयोग कर रहा हूं और यह काम नहीं कर रहा है। क्या सिंटैक्स सही है या एमएस एसक्यूएल पर मान्य नहीं है? – Maestro1024

+0

@ Maestro1024, यह केवल एसक्यूएल सर्वर के नए संस्करणों पर काम करेगा, लेकिन यह निश्चित रूप से वाक्यविन्यास जांच पास करता है। – HLGEM

+0

@ Maestro1024, आप एमएस एसक्यूएल सर्वर का किस संस्करण का उपयोग कर रहे हैं? –

संबंधित मुद्दे