根据上次更新日期计算记录数 + null

Posted

技术标签:

【中文标题】根据上次更新日期计算记录数 + null【英文标题】:Count number of records based on last updated date + null 【发布时间】:2021-01-14 12:40:45 【问题描述】:

遇到我认为很简单的问题。为了计算没有标题的项目,我们的系统会按“last_updated_date”跟踪记录。

id    work_item      title         last_updated_date  
1     task1          ProjectA      2020-03-25 20:20:01.111
2     task2          ProjectA      2020-03-25 20:20:01.111
3     task3                        2020-03-25 20:20:01.111
4     task4          ProjectB      2020-03-25 20:20:01.111
5     task5          ProjectC      2020-03-25 20:20:01.111

如您所见,我需要查看哪些工作项没有项目。如果我要查看“task1”的历史记录,我会看到如下内容:

select work_item, last_updated_date, project
from table
where work_item = 'task1'

这将输出:

work_item      last_updated_date          title
task1          2020-03-25 20:20:01.111    ProjectA
task1          2020-03-17 20:20:01.111    NULL
task1          2020-03-12 20:20:01.111    NULL

基于此,我可以看到 task1 在 2020-03-25 获得了分配的标题。我需要知道的是,整个数据集中有多少工作项没有分配项目。所以我想使用最后更新日期检查所有记录并检查最新的 last_updated_date 以查看 title 是否为空。我尝试了以下方法,但我认为我错误地使用了 MAX 和/或分组?我正在取回分配了标题的记录,这让我认为它正在检查整个 last_updated_date 列的 MAX 值,而不是其中的每条记录。

select id, title, MAX(last_updated_date) as "latest_timestamp"
FROM table
WHERE title is null
group by id, title

我希望看到只有 task3 显示为需要分配一个标题。

【问题讨论】:

我看到您得到了一个可以接受的答案,但您可能还想查看 Snowflake 中的 last_value() 窗口函数。这将完全避免子查询:docs.snowflake.com/en/sql-reference/functions/last_value.html 【参考方案1】:

一个选项使用子查询来过滤每个项目的最新记录。然后,您可以计算其中有多少没有标题:

select count(*)
from mytable t
where 
    last_updated_date = (
        select max(t1.last_updated_date) 
        from mytable t1 
        where t1.work_item = t.work_item
    )
    and title is null

你也可以使用窗口函数:

select count(*)
from (
    select t.*, 
        row_number() over(partition by work_item order by last_updated_date desc) rn
    from mytable t
) t
where rn = 1 and title is null

【讨论】:

哇,第一个成功了。我确实尝试了嵌套选择,但我将 where 子句的条件放在之前而不是之后。看起来我现在得到了正确的结果。

以上是关于根据上次更新日期计算记录数 + null的主要内容,如果未能解决你的问题,请参考以下文章

根据上次日期选择记录

在Django中按日期计算记录数

如何计算几个日期之间的记录数

记录数正确显示,但当日期是相当旧的日期时,“新计算开始日期”列显示所有“######”格式,例如:01-DEC-1184

如何计算当前日期是当年的第几周

Django:获取上次用户访问日期