我 有 一 个 场景 , 我 想 从 MSSQL 2016 的 日志 表 中 返回 Zuora 对象 名称 。 它 应该 只 在 当前 日期 没有 处理 过 一 次 的 情况 下 返回 。
例如 , 3 次 运行 中 的 Account 对象 在 第 一 次 运行 中 未 处理 , 在 第 二 次 运行 中 处理 , 然后 在 第 三 次 运行 中 未 处理 , 则 查询 不 应 在 结果 中 返回 Account , 因为 它 至少 被 处理 过 一 次 。
同样 , 如果 在 所有 3 次 运行 中 尚未 处理 另 一 个 对象 ( 如 Subscription ) , 则 应 打印 该 对象 。
我 尝试 了 下面 的 查询 , 但 没有 得到 预期 的 结果 。
Create table dbo.Zuora_JobStatus_test (
Id bigint identity(1,1) not null,
[Name] varchar(100),
FileId varchar(100),
recordCount bigint,
processed bit,
[status] varchar(100),
[Timestamp] datetime
)
INSERT INTO dbo.Zuora_JobStatus_test ([Name], FileId, recordCount, processed, [status], [Timestamp])
VALUES ('Subscription','FS1',10, 0, 'completed','2022-11-08 13:05:00.000'),
('Account','FA1',1000, 0, 'completed','2022-11-08 13:50:00.000'),
('Subscription','FS2',15, 0, 'completed','2022-11-08 15:05:00.000'),
('Account','FA2',1003, 1, 'completed','2022-11-08 15:10:00.000'),
('Account','FA3',1004, 0, 'completed','2022-11-08 16:10:00.000')
-- Below query prints input data
SELECT * FROM dbo.Zuora_JobStatus_test ORDER BY NAME ASC, timestamp desc
-- Below query along with the Subscription also prints the Account row, which is not required as it was processed once for the current date.
SELECT fileId, name, status, recordCount,[timestamp],processed
FROM
(
SELECT fileId, name, status, recordCount,[timestamp],processed,rn
FROM
(
SELECT fileId, name, status, recordCount, [timestamp], processed
, ROW_NUMBER() OVER (PARTITION BY Name ORDER BY [TimeStamp] DESC) rn
FROM dbo.Zuora_JobStatus_test
WHERE [status] = 'Completed' AND [Name] in ('Account','Subscription')
) x
WHERE x.rn = 1
)x2
WHERE x2.processed = 0
中 的 每 一 个
使用 上面 的 查询 , 我 仍然 在 输出 中 看到 Account , 这 不 应该 是 这种 情况 , 因为 它 在 第 二 次 运行 中 为 当前 日期 处理 了 一 次 = 1 。
DBFIDDLE 的 最 大 值
2条答案
按热度按时间osh3o9ms1#
使用
not exists()
检查已处理行的存在性n3h0vuf22#
这样就可以了。你只需要按对象和日期计算成功处理的次数,然后过滤