SQL में उपयोगकर्ता के लिए दिन का नवीनतम रिकॉर्ड प्राप्त करें

किसी उपयोगकर्ता के लिए दिन का नवीनतम रिकॉर्ड कैसे प्राप्त करें यदि प्रति दिन एक ही तालिका में एक ही उपयोगकर्ता की कई प्रविष्टियाँ हों।

उदाहरण के लिए:

Id      UserName               CreatedOn
1       B               2018-11-20
2       A               2018-12-20
3       A               2018-11-19
4       B               2018-11-18

मुझे उपयोगकर्ता A, B लाइक के लिए परिणाम चाहिए:

Id      UserName               CreatedOn
2       A               2018-12-20
1       B               2018-11-20
0
अधिक नमूना डेटा की आवश्यकता है; आपका वर्तमान परिणाम आपके डेटा से बस प्राप्त किया जा सकता है का चयन करें * तालिका से जहां उपयोगकर्ता नाम = 'ए' </कोड>
जोड़ा लेखक Lee Mac, स्रोत
ID 4 क्यों नहीं लौटाया गया? जैसा कि आपके पास कोई समय मान नहीं है, क्या परिभाषित करता है कि एक पंक्ति "अधिक" हाल ही में है, ID का एक उच्च मूल्य है? (यह देखते हुए कि ID का मान बड़ा हो रहा है, जितना आगे आप जाएंगे, उतनी imply कि संख्या जितनी अधिक हाल ही में कम होगी
जोड़ा लेखक Larnu, स्रोत
आपका नवीनतम संपादन केवल चीजों को अधिक भ्रमित करता है। आप "कैसे प्राप्त करें प्रति दिन नवीनतम रिकॉर्ड उपयोगकर्ता का अगर प्रति दिन तालिका में एक ही उपयोगकर्ता के कई उपयोगकर्ता प्रविष्टि हैं" इसलिए, आपके डेटा के आधार पर, आपके नमूना डेटा की प्रत्येक पंक्ति को लौटाया जाना चाहिए। वे उस दिन के लिए "सबसे हाल की" पंक्ति हैं, क्योंकि किसी भी उपयोगकर्ता के पास समान दिन पर कई प्रविष्टियां नहीं हैं।
जोड़ा लेखक Larnu, स्रोत
@ लर्नू, जो मैंने समझा है वह यह है कि अब दिन की संख्या की बात है, वह सिर्फ दिन/दिन का नवीनतम रिकॉर्ड चाहता है
जोड़ा लेखक affanBajwa, स्रोत
मैं अभी उपयोगकर्ता A की तलाश कर रहा हूं
जोड़ा लेखक Shailendra Pal, स्रोत
क्या कोई मेरे अपडेट की आवश्यकता की जांच कर सकता है?
जोड़ा लेखक Shailendra Pal, स्रोत

7 उत्तर

Create Table #tbl
(
Id Int,
UserName VarChar(25),
CreatedOn Date
)

Insert Into #tbl Values
(1,'B','2018-11-20'),
(2,'A','2018-12-20'),
(3,'A','2018-11-19'),
(4,'B','2018-11-18')


Select Username, Max(CreatedOn) As LastDT from #tbl
Group By UserName

परिणाम:

Username    LastDT
A           2018-12-20
B           2018-11-20

अद्यतन: यह काम करेगा यदि दिन के साथ समूहीकरण: एक साल के चयन का उपयोग करना [डेटटाइम] के साथ

Create Table #tbl
(
Id Int,
UserName VarChar(25),
CreatedOn DateTime
)

Insert Into #tbl Values
(1,'B','2018-11-20 10:45:12.000'),
(2,'A','2018-12-20 07:45:12.000'),
(3,'A','2018-11-19 09:45:12.000'),
(4,'B','2018-11-18 11:45:12.000'),
(5,'B','2018-11-20 01:50:12.000')

 Select  Username, Max(CreatedOn) As LastDT from #tbl
Where DatePart(year,CreatedOn) = '2018'
Group By UserName, DatePart(dayofyear ,CreatedOn)
Order By UserName

दिन के अनुसार परिणाम:

Username    LastDT
A           2018-11-19 09:45:12.000
A           2018-12-20 07:45:12.000
B           2018-11-18 11:45:12.000
B           2018-11-20 10:45:12.000
2
जोड़ा
मुझे विश्वास है कि यह हर समय का नवीनतम रिकॉर्ड देगा, जिसे प्रत्येक दिन का नवीनतम रिकॉर्ड चाहिए।
जोड़ा लेखक affanBajwa, स्रोत
@affanBajwa, मैंने दिन-ब-दिन समूहीकरण की अनुमति के लिए अद्यतन किया। नमूना डेटा ने इसके लिए अनुमति नहीं दी, इसलिए मैंने प्रदर्शन करने के लिए एक दिनांक समय क्षेत्र प्रदान किया।
जोड़ा लेखक level3looper, स्रोत

मुझे लगता है कि आप बस प्रति उपयोगकर्ता नवीनतम रिकॉर्ड चाहते हैं

select  *
from    (
            select  *, rn = row_number() over (partition by UserName order by CreatedOn desc)
            from    yourtable
        ) d
where   d.rn = 1
order by CreatedOn desc
0
जोड़ा

आप निम्नलिखित sql स्टेटमेंट में dense_rank का उपयोग कर सकते हैं

  select Id, UserName, CreatedOn
    from
    (
    select *,
           dense_rank() over ( partition by username order by CreatedOn desc) as
           max_CreatedOn 
      from t 
    ) q
   where max_CreatedOn = 1;

Rextester Demo

0
जोड़ा

Sql सर्वर में TIES फ़ंक्शन के साथ उपयोग करके

SELECT TOP 2 WITH TIES UserName,CreatedOn  
FROM #tbl
ORDER BY ( ROW_NUMBER()OVER(PARTITION BY UserName ORDER BY CreatedOn DESC ))

परिणाम

UserName    CreatedOn
-----------------------
  A         2018-12-20
  B         2018-11-20
0
जोड़ा

यदि आप A अकेले रिकॉर्ड का परिणाम चाहते हैं, तो नीचे की क्वेरी

SELECT * FROM myTable WHERE UserName = 'A' ORDER BY CreatedOn DESC

यदि आप A पंक्तियों का विशेष नंबर चाहते हैं,

SELECT top 2 * FROM myTable WHERE UserName = 'A' ORDER BY CreatedOn DESC
0
जोड़ा

यदि आप प्रत्येक उपयोगकर्ता के लिए नवीनतम रिकॉर्ड चाहते हैं, तो उसे काम करना चाहिए:

SELECT UserName, MAX(CreatedOn) FROM yourTable GROUP BY UserName

यह प्रत्येक उपयोगकर्ता के लिए नवीनतम प्रविष्टि लौटाएगा

आउटपुट:

UserName       CreatedOn
    A          2018-12-20
    B          2018-11-20
0
जोड़ा
लेकिन ओपी को 1 नहीं बल्कि 2 पंक्तियों की उम्मीद है।
जोड़ा लेखक Larnu, स्रोत
ओपी स्पष्टीकरण के बाद संपादित।
जोड़ा लेखक Noob dev, स्रोत

आप निम्न सरल क्वेरी को TOP कीवर्ड का उपयोग करके देख सकते हैं

Create Table #temp
(
Id Int,
UserName VarChar(25),
CreatedOn Date
)

Insert Into #temp Values
(1,'B','2018-11-20'),
(2,'A','2018-12-20'),
(3,'A','2018-11-19'),
(4,'B','2018-11-18')

Select TOP 2 * from #temp ORDER BY CreatedOn DESC

आउटपुट नीचे दिखाया गया है

Id  UserName    CreatedOn
-------------------------
2   A          2018-12-20
1   B          2018-11-20
0
जोड़ा