sql >> Databáze >  >> RDS >> Sqlserver

Použití SQL Server 2012 LAG

Dobře, za prvé jsem přidal řádek, abych vám ukázal, kde odpověď někoho jiného nefunguje, ale teď to smazali.

Nyní k logice v mém dotazu. Řekl jste, že chcete každý řádek, který je do dvou minut od jiného řádku. To znamená, že se musíte s LEAD() dívat nejen dozadu, ale také dopředu. Ve vašem dotazu jste se vrátili, když byl předchozí čas NULL, takže jednoduše vrátil první hodnotu každého OrderNumber bez ohledu na to, zda byl správný nebo špatný. Náhodou bylo potřeba vrátit první hodnoty každého z vašich OrderNumbers, dokud se nedostanete k poslednímu OrderNumber, kde došlo k porušení. Můj dotaz to opravuje a měl by fungovat pro všechna vaše data.

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

Výsledky (Nezapomeňte, že jsem přidal řádek):

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. Připojujete se k databázi třetí strany v Joomle?

  2. Existuje typ časového razítka automatické úpravy pro sloupce Oracle?

  3. Mysql dyanmická hodnota jako alias

  4. Připojte se k databázi serveru z localhost