मैं SSMS 2018 का उपयोग कर रहा हूं और इसके समान एक तालिका है:

CREATE TABLE DxList (DocID INT, Dx VARCHAR(255), DxDate DATE, CreateDate DATETIME);

INSERT INTO DxList (DocID, Dx, DxDate, CreateDate)
VALUES (6018, 'OSDD', '10/01/2015', '10/09/2015 12:27');

INSERT INTO DxList (DocID, Dx, DxDate, CreateDate)
VALUES (6018, 'ADHD', '10/01/2015', '10/09/2015 18:14');

SELECT *
FROM DxList

DocID   Dx      DxDate      CreateDate       
6018    OSDD    10/1/2015   10/9/2015 12:27   
6018    ADHD    10/1/2015   10/9/2015 18:14 

मैं DxDate के आधार पर नवीनतम Dx प्राप्त करना चाहता हूं। Row_number काम करेगा, हालांकि, अगर ऊपर (10/1/2015) की तरह एक टाई है, तो मैं चाहता हूं कि सबसे हाल ही में CreateDate पर आधारित हो।

इस मामले में, मैं चाहता हूं कि मेरा परिणाम हो:

DocID   Dx      DxDate      CreateDate        
6018    ADHD    10/1/2015   10/9/2015 18:14  

मुझे विश्वास है कि मैं इस प्रश्न के साथ Rank() का उपयोग कर सकता हूं लेकिन मुझे यकीन नहीं है कि कैसे। यह मेरी अब तक की क्वेरी है:

SELECT DISTINCT
  DocID,
  Dx,
  DxDate,
  CreateDate,
  rownum1,
  rank1
FROM (SELECT
  DocID,
  Dx,
  DxDate,
  CreateDate,
  RANK() OVER (PARTITION BY DocID ORDER BY DxDate DESC) AS rank1,
  ROW_NUMBER() OVER (PARTITION BY DocID ORDER BY DxDate DESC) AS rownum1
FROM DxList) b
WHERE rownum1 = 1

मेरा मानना ​​​​है कि मैं कुछ ऐसा ढूंढ रहा हूं:

क्रमानुसार (मामला जब रैंक1=रैंक1 तब क्रिएटडेट और डीएक्सडेट खत्म हो) डीईएससी

बेशक यह काम नहीं करता है क्योंकि मुझे किसी प्रकार की पुनरावृत्ति की आवश्यकता है और इसे सबक्वायरी में नहीं रखा जा सकता है। मैं इस समस्या को हल करने के लिए किसी भी व्युत्पन्न तालिका का उपयोग नहीं कर सकता। क्या यह संभव है? बहुत सराहना की!

0
WixLove 9 सितंबर 2018, 07:08

3 जवाब

सबसे बढ़िया उत्तर

आपको ROW_NUMBER को दो-स्तरीय ORDER BY क्लॉज के साथ उपयोग करने में सक्षम होना चाहिए:

SELECT DocID, Dx, DxDate, CreateDate
FROM
(
    SELECT *,
        ROW_NUMBER() OVER (PARTITION BY DocID ORDER BY DxDate DESC, CreateDate DESC) rn
    FROM DxList
) t
WHERE rn = 1;

उपरोक्त क्वेरी बनाम आपके मन में एकमात्र बड़ा बदलाव यह है कि एक ही DocID और DxDate मानों वाले दो रिकॉर्ड की तुलना CreateDate द्वारा की जाएगी ताकि यह तय किया जा सके कि वास्तव में कौन सा है सबसे पहला।"

डेमो

नोट: आपके डेमो में दोनों रिकॉर्ड में भिन्न DocID मान हैं, लेकिन मुझे लगता है कि आप उनके लिए समान मान रखना चाहते हैं। उपरोक्त डेमो लिंक में, मैंने दो रिकॉर्ड्स को समान DocID मान के लिए बदल दिया है, और तर्क काम कर रहा है।

2
Brien Foss 9 सितंबर 2018, 08:23

आप केवल ROW_NUMBER() और ORDER BY CreateDate का उपयोग कर सकते हैं यह काम करेगा।

ROW_NUMBER() ओवर (डॉकआईडी ऑर्डर द्वारा क्रिएटडेट डीईएससी द्वारा विभाजन) पंक्ति संख्या 1 के रूप में

0
Shivam 9 सितंबर 2018, 07:19

आपके नमूना डेटा के अनुसार बस नीचे क्वेरी की आवश्यकता है

  SELECT top 1 *           
        FROM DxList
        order by DxDate desc,CreateDate desc

लेकिन आपके विवरण के अनुसार @Tim प्रदान की गई क्वेरी का अनुसरण करें

यहाँ इस लिंक में दोनों प्रश्न आपको मिलेंगे

https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=44fdd4b2e849137cebe9df837ac41a39

DocID   Dx  DxDate  CreateDate
6018    ADHD    01/10/2015 00:00:00 09/10/2015 18:14:00
0
Zaynul Abadin Tuhin 9 सितंबर 2018, 07:23