SQL Server SQL -如何获取唯一对象的行,这些行在当前日期甚至一次也未处理

jv4diomz  于 2022-11-21  发布在  其他
关注(0)|答案(2)|浏览(96)

我 有 一 个 场景 , 我 想 从 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 的 最 大 值

osh3o9ms

osh3o9ms1#

使用not exists()检查已处理行的存在性

select *
from
(
       select *,
              rn = row_number() over (partition by [Name] order by TimeStamp desc, id desc) 
       from   dbo.Zuora_JobStatus_test t
       where  [status] = 'Completed' 
       and    [Name]  in ('Account','Subscription')
       and    not exists
              (
                 select *
                 from    dbo.Zuora_JobStatus_test x
                 where   x.[Name] = t.[Name]
                 and     x.processed = 1
              )
) d
where d.rn  = 1
n3h0vuf2

n3h0vuf22#

这样就可以了。你只需要按对象和日期计算成功处理的次数,然后过滤

SELECT 
    name,
    CAST([timestamp] AS date) AS ExecDate,
    SUM(CASE WHEN processed = 1 THEN 1 ELSE 0 END) as NumOfSuccess
FROM dbo.Zuora_JobStatus_test
WHERE
    [status] = 'Completed' 
    AND [Name]  in ('Account','Subscription')
GROUP BY 
    name,
    CAST([timestamp] AS date)
HAVING SUM(CASE WHEN processed = 1 THEN 1 ELSE 0 END) = 0

相关问题