Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Използване на SQL Server 2012 LAG

Добре, първо добавих ред, за да ви покажа къде отговорът на някой друг не работи, но сега го изтриха.

Сега за логиката в моето запитване. Казахте, че искате всеки ред, който е в рамките на две минути от друг ред. Това означава, че трябва да гледате не само назад, но и напред с LEAD(). Във вашата заявка вие върнахте, когато предишното време беше NULL, така че просто върна първата стойност на всеки OrderNumber, независимо дали е правилна или грешна. Случайно първите стойности на всеки от вашите OrderNumber трябваше да бъдат върнати, докато стигнете до последния OrderNumber, където той се повреди. Моята заявка коригира това и трябва да работи за всичките ви данни.

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. Как да изпълним съхранена процедура в заявка за избор

  2. Можем ли да изпълняваме SQL скрипт, като използваме първите миграции на код?

  3. Неправилен синтаксис близо до '(' при проверка на фрагментацията на индекса

  4. Импортиране на CSV в SQL Server 2008

  5. идентификатор на служител автоматично генериране с префикс