Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Korzystanie z programu LAG programu SQL Server 2012

Dobra, przede wszystkim dodałem wiersz, aby pokazać, gdzie odpowiedź innej osoby nie działa, ale teraz ją usunęli.

Przejdźmy teraz do logiki w moim zapytaniu. Powiedziałeś, że chcesz, aby każdy rząd znajdował się w ciągu dwóch minut od innego rzędu. Oznacza to, że za pomocą LEAD() musisz patrzeć nie tylko wstecz, ale także w przód. W zapytaniu zwrócono, gdy poprzedni czas był NULL, więc po prostu zwróciło pierwszą wartość każdego numeru zamówienia, niezależnie od tego, czy była poprawna, czy nie. Przez przypadek, pierwsze wartości każdego z Twoich numerów zamówień musiały zostać zwrócone, dopóki nie dojdziesz do ostatniego numeru zamówienia, w którym się zepsuł. Moje zapytanie to poprawia i powinno działać dla wszystkich Twoich danych.

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

Wyniki (pamiętaj, że dodałem wiersz):

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. kopiowanie tabel z danymi do innej bazy danych w SQL Server 2008

  2. SQL Server 2017 Instalacja krok po kroku -1

  3. SQL, wybór pomiędzy datą/godziną

  4. Wypróbuj te sprawdzone metody monitorowania bazy danych MySQL

  5. używanie typu danych datetimeoffset z jTDS