Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

अनुक्रमिक दिनांक डेटा समूह करने के लिए SQL सर्वर क्वेरी

पहले कुछ परीक्षण डेटा:

create table seasons (seasonId int primary key
    , "date" datetime not null unique
    , tariffId int not null)

insert into seasons values (1, '2009-01-01', 1)
insert into seasons values (2, '2009-01-02', 1)
insert into seasons values (3, '2009-01-03', 2)
insert into seasons values (4, '2009-01-04', 3)
insert into seasons values (5, '2009-01-05', 3)
insert into seasons values (6, '2009-01-06', 1)
insert into seasons values (7, '2009-01-07', 1)
insert into seasons values (8, '2009-01-08', 3)
-- add a tarrif with a datespan larger than 2
insert into seasons values (9, '2009-01-09', 4)
insert into seasons values (10, '2009-01-10', 4)
insert into seasons values (11, '2009-01-11', 4)

डेव बार्कर के उत्तर पर निर्माण, इनलाइन दृश्यों के भीतर row_number() जोड़ें ताकि हम जान सकें कि टैरिफआईड द्वारा पहला न्यूनतम मान कौन सा है, जो दूसरा है, आदि। (वास्तव में चूंकि किसी तिथि में एक से अधिक टैरिफ आईडी नहीं हो सकते हैं, इसलिए हमें टैरिफ आईडी द्वारा विभाजन करने की आवश्यकता नहीं है।)

[dbo] से RN के रूप में
SELECT MinValues.Seasonid, MinValues.Date, MaxValues.Date, MaxValues.tariffid 
FROM (
    SELECT *, row_number() over (partition by tariffId order by "date") as RN 
      FROM [dbo].[Seasons] tbl1
     WHERE NOT EXISTS (SELECT * 
                         FROM [dbo].[Seasons] tbl2 
                        WHERE tbl1.seasonid - tbl2.seasonid = 1 
                          AND tbl1.tariffId = tbl2.tariffId)) as minValues
JOIN (
     SELECT *, row_number() over (partition by tariffId order by "date") as RN
       FROM [dbo].[Seasons] tbl1
      WHERE NOT EXISTS (SELECT *
                          FROM [dbo].[Seasons] tbl2 
                         WHERE tbl2.seasonid - tbl1.seasonid = 1 
                           AND tbl1.tariffId = tbl2.tariffId)) as maxValues
ON MinValues.TariffId = MaxValues.tariffId
and MinValues.RN = MaxValues.RN
order by MinValues.Date

परिणाम:

1   2009-01-01 00:00:00.000 2009-01-02 00:00:00.000 1
3   2009-01-03 00:00:00.000 2009-01-03 00:00:00.000 2
4   2009-01-04 00:00:00.000 2009-01-05 00:00:00.000 3
6   2009-01-06 00:00:00.000 2009-01-07 00:00:00.000 1
8   2009-01-08 00:00:00.000 2009-01-08 00:00:00.000 3
9   2009-01-09 00:00:00.000 2009-01-11 00:00:00.000 4


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. सम्मिलित तिथि के लिए डिफ़ॉल्ट गेटडेट

  2. नेटवर्क पर डेटाबेस बैकअप पुनर्स्थापित करें

  3. SQL सर्वर में एक स्ट्रिंग में प्रत्येक शब्द के पहले अक्षर को कैपिटलाइज़ करने का सबसे अच्छा तरीका क्या है

  4. SQL सर्वर तालिका से यादृच्छिक पंक्तियाँ कैसे प्राप्त करें - SQL सर्वर / TSQL ट्यूटोरियल भाग 117

  5. CTE में INDEX जोड़ना