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

SQL सर्वर 2012 LAG का उपयोग करना

ठीक है, सबसे पहले मैंने आपको यह दिखाने के लिए एक पंक्ति जोड़ी है कि किसी और का उत्तर कहाँ काम नहीं करता है लेकिन उन्होंने इसे अभी हटा दिया है।

अब मेरी क्वेरी में तर्क के लिए। आपने कहा था कि आप प्रत्येक पंक्ति चाहते हैं जो दूसरी पंक्ति के दो मिनट के भीतर हो। इसका मतलब है कि आपको न केवल पीछे की ओर देखना होगा, बल्कि LEAD () के साथ आगे भी देखना होगा। आपकी क्वेरी में, पिछली बार NULL होने पर आप वापस आ गए थे, इसलिए यह प्रत्येक ऑर्डर नंबर का पहला मान लौटाता है, भले ही वह सही या गलत हो। संयोग से, आपके प्रत्येक ऑर्डर नंबर के पहले मूल्यों को तब तक वापस करने की आवश्यकता होती है जब तक कि आप अंतिम ऑर्डर नंबर तक नहीं पहुंच जाते जहां यह टूट गया था। मेरी क्वेरी इसे ठीक करती है और आपके सभी डेटा के लिए काम करना चाहिए।

CREATE TABLE [Order]  
    (
            OrderNumber    VARCHAR(20) NOT NULL
        ,   OrderDateTime   DATETIME NOT NULL
    );

    INSERT [Order] (OrderNumber, OrderDateTime) 
    VALUES
        ('1234', '2012-04-28 09:00:00'),
        ('1234', '2012-04-28 09:01:00'),
        ('1234', '2012-04-28 09:03:00'),
        ('5678', '2012-04-28 09:40:00'),
        ('5678', '2012-04-28 09:42:00'),
        ('5678', '2012-04-28 09:44:00'),
        ('91011', '2012-04-28 10:00:00'),
        ('91011', '2012-04-28 10:25:00'),
        ('91011', '2012-04-28 10:27:00');

with Ordered as (
  select
    OrderNumber,
    OrderDateTime,
    LAG(OrderDateTime,1) over (
      partition by OrderNumber
      order by OrderDateTime
    ) as prev_time,
    LEAD(OrderDateTime,1) over (
      partition by OrderNumber
      order by OrderDateTime
    ) as next_time
  from [Order]
)

SELECT  OrderNumber,
        OrderDateTime
FROM Ordered
WHERE   DATEDIFF(MINUTE,OrderDateTime,next_time) <= 2  --this says if the next value is less than or equal to two minutes away return it
        OR DATEDIFF(MINUTE,prev_time,OrderDateTime) <= 2 --this says if the prev value is less than or equal to 2 minutes away return it

परिणाम (याद रखें मैंने एक पंक्ति जोड़ी है):

OrderNumber          OrderDateTime
-------------------- -----------------------
1234                 2012-04-28 09:00:00.000
1234                 2012-04-28 09:01:00.000
1234                 2012-04-28 09:03:00.000
5678                 2012-04-28 09:40:00.000
5678                 2012-04-28 09:42:00.000
5678                 2012-04-28 09:44:00.000
91011                2012-04-28 10:25:00.000
91011                2012-04-28 10:27:00.000



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. क्या SQL सर्वर 2005 डेटाटाइम2 का समर्थन करता है?

  2. ग्रुप बाय और ऑर्डर बाय क्लॉज में SQL क्वेरी एरर

  3. SQL सर्वर में XML पथ के लिए और [पाठ ()]

  4. SQL सर्वर (T-SQL) में डेटा फ़ाइल का आकार कैसे कम करें

  5. प्रति दिन सटीक ट्रैक समय प्राप्त करने के लिए निम्न क्वेरी में ओवरलैप अंतराल को कैसे छोड़ें