创建每小时重置的序列号

问题描述 投票:0回答:1

我正在尝试创建一个该帐户唯一的序列号,并在一小时没有活动后重置。下面我有生成示例数据和所需输出的代码。我尝试过执行 lag、lead、row_number、将日期和时间列合并到日期时间字段中以在这些函数中使用,但我还没有让它工作。

我正在 SQL Server 2016 工作

DROP TABLE IF EXISTS #TempFuelPurchase;

CREATE TABLE #TempFuelPurchase (
    Account_Number INT,
    FuelPurchase_Date DATE,
    Fuel_TOD TIME
);

INSERT INTO #TempFuelPurchase (Account_Number, FuelPurchase_Date, Fuel_TOD)
VALUES
    (19, '2024-04-03', '07:02:02 AM'),
    (19, '2024-04-03', '07:02:41 AM'),
    (19, '2024-04-03', '02:58:49 PM'),
    (19, '2024-04-03', '07:58:49 PM'),
    (19, '2024-04-05', '02:58:49 PM'),
    (19, '2024-04-05', '02:59:31 PM'),
    (19, '2024-04-17', '11:56:13 PM'),
    (20, '2024-04-17', '11:59:13 PM'),
    (19, '2024-04-18', '12:15:13 AM'),
    (19, '2024-04-18', '02:56:13 PM'),
    (20, '2024-04-18', '07:41:55 AM'),
    (20, '2024-04-18', '07:41:55 PM'),
    (20, '2024-04-18', '07:56:55 PM'),
    (19, '2024-04-19', '07:41:55 AM'),
    (19, '2024-04-19', '07:42:20 AM');



DROP TABLE IF EXISTS #DesiredOutput;

CREATE TABLE #DesiredOutput (
    Account_Number INT,
    FuelPurchase_Date DATE,
    Fuel_TOD TIME,
    Seq Int
);

INSERT INTO #DesiredOutput (Account_Number, FuelPurchase_Date, Fuel_TOD, Seq)
VALUES
    (19, '2024-04-03', '07:02:02 AM',1),
    (19, '2024-04-03', '07:02:41 AM',2),
    (19, '2024-04-03', '02:58:49 PM',1),
    (19, '2024-04-03', '07:58:49 PM',1),
    (19, '2024-04-05', '02:58:49 PM',1),
    (19, '2024-04-05', '02:59:31 PM',2),
    (19, '2024-04-17', '11:56:13 PM',1),
    (20, '2024-04-17', '11:59:13 PM',1),
    (19, '2024-04-18', '12:15:13 AM',2),
    (19, '2024-04-18', '02:56:13 PM',1),
    (20, '2024-04-18', '07:41:55 AM',1),
    (20, '2024-04-18', '07:41:55 PM',1),
    (20, '2024-04-18', '07:56:55 PM',2),
    (19, '2024-04-19', '07:41:55 AM',1),
    (19, '2024-04-19', '07:42:20 AM',2);
sql sql-server sequence window-functions sql-server-2016
1个回答
0
投票
with dataX as (
    select *,
        cast(FuelPurchase_Date as datetime + cast(Fuel_TOD as datetime) as Fuel_DT
    from T
), dataY as (
    select *,
        row_number() over (partition by Account_Number order by Fuel_DT) as rn,
        lag(Fuel_DT) over (partition by Account_Number order by Fuel_DT) as last_DT
    from dataX
), dataZ as (
    select *,
        case when datediff(second, last_DT, Fuel_DT) < 3600 then rn
                           Fuel_DT) < 3600 then rn end as brk
    from dataY
)
select Account_Number, FuelPurchase_Date, Fuel_TOD,
    rn + 1 - max(brk) over (partition by Account_Number order by Fuel_DT) as Seq
from dataZ;
© www.soinside.com 2019 - 2024. All rights reserved.