Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Menggunakan SQL Server 2012 LAG

Oke pertama-tama saya menambahkan baris untuk menunjukkan kepada Anda di mana jawaban orang lain tidak berfungsi tetapi mereka menghapusnya sekarang.

Sekarang untuk logika dalam permintaan saya. Anda mengatakan Anda ingin setiap baris yang berjarak dua menit dari baris lain. Itu berarti Anda tidak hanya harus melihat ke belakang, tetapi juga ke depan dengan LEAD(). Dalam kueri Anda, Anda kembali ketika waktu sebelumnya adalah NULL sehingga hanya mengembalikan nilai pertama dari setiap OrderNumber terlepas dari apakah itu benar atau salah. Secara kebetulan, nilai pertama dari masing-masing OrderNumber Anda perlu dikembalikan hingga Anda mencapai OrderNumber terakhir yang rusak. Kueri saya mengoreksinya dan akan berfungsi untuk semua data Anda.

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

Hasil (Ingat saya menambahkan satu baris):

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. Menyetel Layanan Pelaporan SQL Server

  2. Mengapa kueri SQL Server ini menemui jalan buntu?

  3. Memperbarui nilai string dalam tabel yang akan di-flop seperti string YYYYMMDD ke string MMDDYYYY

  4. Pengecualian SQL yang mengganggu, mungkin karena beberapa kode salah

  5. Perhitungan biaya rata-rata tertimbang abadi SQL Server 2008