2017-08-16 6 views
9

मेरे पास एक टेबल है और फ़ील्ड में से एक एक फ़ील्ड फ़ील्ड है।तालिका से दो कॉलम में दिनांकों का चयन

मुझे एक प्रश्न लिखने के लिए कहा गया है जो कॉलम ए में अलग-अलग तिथियों (आदेशित) की एक सूची देता है और उसके बाद एक और कॉलम होता है, बी की तारीख कहें जहां कॉलम बी की तारीख सबसे बड़ी तारीख है जो कम से कम है स्तंभ ए

MyDateField 

    2017-01-01 
    2017-01-01 
    2017-01-01 
    2017-01-02 
    2017-01-02 
    2017-01-03 
    2017-01-04 
    2017-01-05 
    2017-01-05 
    2017-01-05 

उत्तर आवश्यक

2017-01-05  2017-01-04 
    2017-01-04  2017-01-03 
    2017-01-03  2017-01-02 
    2017-01-02  2017-01-01 
    2017-01-01  
+0

इस स्तंभ बी भी वह एक ही मेज से आता है, या सिर्फ 'date_column -' 1 दिन 'ऐसा करेगा? –

+0

यह उसी तालिका से आता है – mHelpMe

उत्तर

7

आप एसक्यूएल सर्वर-2012+ का उपयोग कर रहे हैं, तो आप तालिका के बाहर पिछले सबसे बड़ी तारीख को लाने के लिए LAG() उपयोग कर सकते हैं:

SELECT t.date, 
     LAG(t.date,1) OVER(ORDER BY t.date) as last_biggest_date 
FROM (SELECT DISTINCT s.dateField FROM YourTable s) t 
+1

बस यह नोट करते हुए कि यह SQL Server 2012+ है, हालांकि उसने अपना डीबीएमएस पोस्ट नहीं किया है। – justiceorjustus

+0

@justiceorjustus आप सही, संपादित हैं। – sagi

+1

जो शानदार है! – mHelpMe

1

आप दूसरे कॉलम में छोटा तिथि वापस जाने के लिए सबक्वेरी लागू उपयोग कर सकते हैं:

select distinct t1.MyDateField, x.MyDateField 
from MyTable t1 
outer apply (select max(MyDateField) MyDateField 
      from MyTable t2 
      where t1.MyDateField> t2.MyDateField) x 
+0

बस एक सिर ऊपर ... 'TOP 1' बाहरी लागू करने के लिए एक ही उप-क्वेरी में 'ORDER BY' निर्दिष्ट किए बिना बाहरी (या फिर भी वही) होने की गारंटी नहीं है। – scsimon

+0

आप सही हैं, मैं 'अधिकतम 1'' 'MAX()' के साथ स्विच करता हूं, इसलिए यह हमेशा सही दिनांक – Mat

2

आप अन्य बातों के अलावा एक CTE के साथ ऐसा कर सकते हैं। यह अलग-अलग तिथियों की एक सूची प्राप्त करता है, और फिर स्वयं-जुड़ने का उपयोग करता है।

with cte as(
    select distinct 
     MyDateField 
    from 
     YourTable) 

select 
    c.MyDateField 
    ,max(c2.MyDateField) as MaxDate 
from 
    cte c 
left join cte c2 on c2.MyDateField < c.MyDateField 
group by 
    c.MyDateField 
order by 
    c.MyDateField 

या एक सरल आत्म में शामिल होने के बिना एक CTE

--in this case DISTINCT isn't really needed, but left in case there are other columns 
select distinct 
    c.MyDateField 
    ,max(c2.MyDateField) as MaxDate 
from 
    myTable c 
left join myTable c2 on c2.MyDateField < c.MyDateField 
group by 
    c.MyDateField 
order by 
    c.MyDateField 
+0

लौटाता है, मुझे एम $ -एसक्यूएल सीटीई सिंटैक्स नहीं पता है, लेकिन यह सीटीई के बिना भी काम करना चाहिए ... –

+0

आप सही @UsagiMiyamoto, मुझे बस बहुत से लोगों के लिए पढ़ना आसान लगता है। – scsimon

0
SELECT d, LAG(d) OVER (ORDER BY d) AS d2 
    FROM (
      SELECT DISTINCT d 
       FROM (VALUES ('2017-01-01'), 
          ('2017-01-01'), 
          ('2017-01-01'), 
          ('2017-01-02'), 
          ('2017-01-02'), 
          ('2017-01-03'), 
          ('2017-01-04'), 
          ('2017-01-05'), 
          ('2017-01-05'), 
          ('2017-01-05')) AS dates(d) 
     ) AS d(d) 
ORDER BY d DESC; 

आउटपुट:

d   d2 
---------- ---------- 
2017-01-05 2017-01-04 
2017-01-04 2017-01-03 
2017-01-03 2017-01-02 
2017-01-02 2017-01-01 
2017-01-01 NULL 
0
with CTE as(
select 
ROW_NUMBER() over (order by MyDateField) 'RN', 
MyDateField from TempTable 
group by MyDateField) 
select t2.MyDateField,t1.MyDateField from CTE t1 
right join CTE t2 
on t1.RN=t2.RN-1 
order by t2.MyDateField desc 
संबंधित मुद्दे