2009-04-09 26 views
6

मैं इस तरह एक संरचना कुछ के साथ एक मेज विरासत में मिला हैइतिहास तालिका से सबसे हाल ही राज्यों का चयन करें

ID Name Timestamp Data 
---------------------------- 
1 A  40   ... 
2 A  30   ... 
3 A  20   ... 
4 B  40   ... 
5 B  20   ... 
6 C  30   ... 
7 C  20   ... 
8 C  10   ... 

ID एक पहचान क्षेत्र और प्राथमिक कुंजी है और वहाँ Name और Timestamp पर गैर-अद्वितीय अनुक्रमित रहे हैं खेत।

क्या सबसे कारगर तरीका पंक्तियों उपरोक्त तालिका में प्रत्येक आइटम नाम के लिए सबसे हाल ही में रिकॉर्ड, यानी प्राप्त करने के लिए, और लौटे किया जाना चाहिए के रूप में वे सबसे अप हैं- हैं आइटम एक, बी और सी क्रमशः के लिए तिथि प्रविष्टियों।

उत्तर

13

SQL सर्वर 2005 (के बाद):

WITH MostRecentRows AS 
(
    SELECT ID, Name, Data, 
    ROW_NUMBER() OVER (PARTITION BY Name ORDER BY TimeStamp DESC) AS 'RowNumber' 
    FROM MySchema.MyTable 
) 
SELECT * FROM MostRecentRows 
WHERE RowNumber = 1 
+0

+1 वास्तव में क्या मैं के बारे में सोच रहा था और साथ ही। – Sung

+0

हू। +1। मुझे यह काम करने के लिए मिला, लेकिन मैं आपको नहीं बता सका कि 'MostRecentRows',' Row_Number() ', या 'पार्टिशन' जादू कर रहा है या नहीं। – jp2code

+0

वास्तव में मैं क्या – arjun

5

मान लिया जाये कि नाम प्रति कोई डुप्लिकेट timestamps देखते हैं, कुछ इस तरह काम करना चाहिए:

SELECT ID, Name, Timestamp, Data 
FROM test AS o 
WHERE o.Timestamp = (SELECT MAX(Timestamp) 
        FROM test as i 
        WHERE i.name = o.name) 
+0

सहसंबंधित सबक्वायरीज़ के लिए +1 – Sung

+2

हां, यह केवल तभी काम करेगा जब कोई डुप्लिकेट टाइमस्टैम्प न हो। सीटीई विवरण निश्चित रूप से सुरक्षित है क्योंकि यह केवल एक पंक्ति लौटाएगा। एक वैकल्पिक SQL Server 2000 समाधान –

3

एसक्यूएल सर्वर 2000:

SELECT 
    ID, Name, Timestamp, Data 
FROM 
    DataTable 
    INNER JOIN 
    (
    SELECT ID, MAX(Timestamp) Timestamp FROM DataTable GROUP BY ID 
) latest ON 
    DataTable.ID = Latest.ID AND 
    DataTable.Timestamp = Latest.Timestamp 
+0

+1 एक बार स्टैंप के लिए एकाधिक रिकॉर्ड होने पर यह एक से अधिक रिकॉर्ड लौटा सकता है। – Sung

+0

के लिए –

+0

मैं इस तथ्य से पूरी तरह से वाकिफ हूँ। BY खंड एक अतिरिक्त बाहरी ग्रुप इस जोखिम को माइग्रेट कर नकल चाहिए timestamps संभव हो सकता है। – Tomalak

0

आप एसक्यूएल सर्वर 2005/2008 उपयोग कर रहे हैं, तो CTE समाधान पहले से ही मिच Weat द्वारा सूचीबद्ध से सबसे अच्छा है एक प्रदर्शन परिप्रेक्ष्य। हालांकि, आप SQL Server 2000 का उपयोग कर रहे हैं, तो आपको कल्पना नहीं कर सकते नाम वहाँ नकल नहीं कर रहे हैं | टाइमस्टैम्प संयोजन। नाम में केवल एक रिकॉर्ड वापस जाने के लिए निम्नलिखित कोड का उपयोग करें:

SELECT ID 
    , Name 
    , TimeStamp 
    , Data 
FROM DataTable dt 
INNER JOIN 
    (SELECT Name 
    , MIN(DataTable.ID) AS MinimumID 
FROM DataTable 
INNER JOIN 
    (SELECT Name 
     , MAX(Timestamp) AS Timestamp 
    FROM DataTable 
    GROUP BY Name) latest 
    ON DataTable.Name = Latest.Name 
    AND DataTable.Timestamp = Latest.Timestamp 
GROUP BY Name) MinimumLatest 
ON dt.ID = MinimumLatest.ID 

तो अगर आप सी 30 9 की तरह एक और रिकॉर्ड जोड़ने, तो यह केवल वापस आ जाएगी आईडी 6. आप इस दूर जाना नहीं है, तो आप कर सकते हैं वापसी 9 सी 30 और 6 सी अंत 30.

0

एक और आसान तरीका:

SELECT ID,Name,Timestamp, Data 
FROM Test_Most_Recent 
WHERE Timestamp = (SELECT MAX(Timestamp) 
       FROM Test_Most_Recent 
       group by Name); 
संबंधित मुद्दे