首页 > 解决方案 > 每月计算

问题描述

我似乎无法理解我应该如何处理这个 select 语句。

我有一个名为 Unified_assets 的表,其中包含 firstseen 和 lastseen 等日期列。

我需要查询的是:每月所有资产。

显然从 firstseen 开始计算,但也排除了该给定月份持续时间超过 3 个月的任何行。

我可以计算所有的第一次看到,因为这是相当直截了当的。

微软 SQL 16

SELECT YEAR(firstseen) Year, MONTH(firstseen) Month, COUNT(*) Count

FROM unified_assets

GROUP BY YEAR(firstseen), MONTH(firstseen)

ORDER BY YEAR(firstseen), MONTH(firstseen);

基本上我现在需要做的是添加一个列,添加所有以前的“firstseen”并减去所有超过 3 个月的“lastseen”。

任何指针将不胜感激。

标签: sqlsql-serverdatabasesql-server-2016

解决方案


一种方法是生成月份,然后使用相关子查询或apply进行计算。

以下计算每月第一天的活跃人数。它首先生成 2018 年的所有月份——或者你感兴趣的任何范围:

with months as (
      select convert(date, '2018-01-01') as yyyymm
      union all
      select dateadd(month, 1, yyyymm)
      from months
      where yyyymm < '2018-01-12'
     )
select m.yyyymm,
       (select count(*)
        from unified_assets ua
        where ua.firstseen <= m.yyyymm and
              ua.lastseen >= m.yyyymm
       ) as cnt
from months m
order by m.yyyymm;

推荐阅读