【问题标题】:Get retry time from logs table using SQL使用 SQL 从日志表中获取重试时间
【发布时间】:2021-12-31 09:32:19
【问题描述】:

日志表的表结构

id reference_id service_name type data created_on
504 7cb54c325450b4bc26 CC_VERIFY_REGISTRATION 0 {{response_data}} 2020-09-14 07:53:42
505 7cb54c325450b4bc26 CC_VERIFY_REGISTRATION 0 {{response_data}} 2020-09-15 17:13:09
506 7cb54c325450b4bc26 MOBILE_VERIFY 0 {{response_data}} 2020-09-20 7:53:42

这是示例数据。使用此参考 ID,注册了许多服务日志。 CC_VERFIY_REGISTRATION 服务失败,因此 2 个条目表示最新条目。如何确定特定 reference_id

的 ANY API 的上次重试时间
select created_on
        ,service_name 
from thirdparty_service_logs tsl  
where reference_id ='7cb54c325450b4bc26'
group by service_name ,created_on

这为每个服务提供了最新的 created_on。但是寻找最新 created_on 的 reference_id 。在这种情况下,虽然最新的 api 调用是针对 MOBILE_VERIFY,但我正在寻找 id 505 的 created_date 列 作为输出

【问题讨论】:

  • 这为每个服务提供了最新的 created_on。不,它没有。您正在对唯一记录进行分组,因为 created_on 是唯一的。除此之外,从您的描述中不清楚为什么您不简单地过滤掉具有service_name = MOBILE_VERIFY 的记录。
  • 这能回答你的问题吗? Get top 1 row of each group

标签: sql sql-server


【解决方案1】:

您可以找到reference_id 的最后一条记录,如下所示:

declare @table table(id int,    reference_id varchar(50),   service_name varchar(50),   type int,   data varchar(50),   created_on datetime)

INSERT INTO @Table values
(504    ,'7cb54c325450b4bc26','CC_VERIFY_REGISTRATION', 0   ,'{{response_data}}','2020-09-14T07:53:42'),
(505    ,'7cb54c325450b4bc26','CC_VERIFY_REGISTRATION', 0   ,'{{response_data}}','2020-09-15T17:13:09'),
(506    ,'7cb54c325450b4bc26','MOBILE_VERIFY',  0           ,'{{response_data}}','2020-09-20T07:53:42');


SELECT top 1 * FROM @table  as ot where reference_id = '7cb54c325450b4bc26'
and created_on < (SELECT max(created_on) from @table as it where it.reference_id = ot.reference_id)
order by created_on desc
id reference_id service_name type data created_on
505 7cb54c325450b4bc26 CC_VERIFY_REGISTRATION 0 {{response_data}} 2020-09-15 17:13:09.000

【讨论】:

    【解决方案2】:

    您可以使用CTE根据您的重试条件预取reference_id和对应的max(created_on),然后使用它来获取目标行。

    With CTE As (
        Select reference_id, Max(created_on) As Lst
        From thirdparty_service_logs
        Group by reference_id
        Having Count(*)>1)
    Select *
    From thirdparty_service_logs As t
    Where Exists (Select * From CTE Where reference_id=t.reference_id And lst=t.created_on)
    Order by reference_id
    

    db<>fiddle

    结果:

    id reference_id service_name type data created_on
    506 7cb54c325450b4bc26 MOBILE_VERIFY 0 {{response_data}} 2020-09-20 07:53:42.000

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-16
      • 1970-01-01
      • 2011-04-09
      • 2020-02-07
      相关资源
      最近更新 更多