Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Sử dụng SQL Server 2012 LAG

Được rồi, trước hết, tôi đã thêm một hàng để hiển thị cho bạn nơi câu trả lời của người khác không hoạt động nhưng họ đã xóa nó ngay bây giờ.

Bây giờ cho logic trong truy vấn của tôi. Bạn đã nói rằng bạn muốn mỗi hàng cách hàng khác trong vòng hai phút. Điều đó có nghĩa là bạn không chỉ phải nhìn ngược lại mà còn phải nhìn về phía trước với LEAD (). Trong truy vấn của bạn, bạn đã trả về khi thời gian trước đó là NULL nên nó chỉ trả về giá trị đầu tiên của mỗi Số thứ tự bất kể nó đúng hay sai. Tình cờ, các giá trị đầu tiên của mỗi Số thứ tự của bạn cần được trả lại cho đến khi bạn đến Số thứ tự cuối cùng mà nó bị hỏng. Truy vấn của tôi khắc phục điều đó và sẽ hoạt động với tất cả dữ liệu của bạn.

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

Kết quả (Hãy nhớ rằng tôi đã thêm một hàng):

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. Bảng tổng hợp động với nhiều cột trong máy chủ sql

  2. Lưu trữ thời gian trong ngày trong SQL

  3. Tại sao chúng ta luôn thích sử dụng các tham số trong các câu lệnh SQL?

  4. xóa các bản ghi khỏi bảng dàn sau khi chúng đã được thêm vào bảng thực

  5. Không thể hoàn tất quá trình đăng nhập do sự chậm trễ trong việc mở kết nối máy chủ trong azure Db bằng ssis