sql计数每个月之前不存在的新id

时间:2018-01-26 08:34:49

标签: sql postgresql

我有以下数据集 enter image description here

如何编写sql以在右侧显示结果? 这是先前每个月出现的唯一身份的计数。

1 个答案:

答案 0 :(得分:0)

经过长时间阅读和阅读他的问题,Ssiu想要问以下内容:

enter image description here

所以这里是MS SQL中的测试数据:当时他没有澄清 window.scrollY

postgresql

免责声明:以下不是解决此问题的最佳方法。它不适用于更多,但它可以为Ssiu提供线索。

create table tmp1 (
    ddate datetime
  , iid   int
)

insert into tmp1 values
 ('2017-11-01',1)
,('2017-11-02',2)
,('2017-11-03',3)
,('2017-11-04',4)
,('2017-11-05',5)
,('2017-11-06',5)
,('2017-11-07',5)
,('2017-12-01',1)
,('2017-12-02',2)
,('2017-12-03',3)
,('2017-12-04',6)
,('2017-12-05',7)
,('2018-01-01',1)
,('2018-01-02',2)
,('2018-01-03',3)
,('2018-01-04',4)
,('2018-01-05',8)

请注意cte_cnt201801 CTE的数据:

with cte(mmonth, iid) as (
  select distinct convert(varchar(7), ddate, 120) mmonth
       , iid
    from tmp1
)
, cte_201711 as (
  select * from cte where mmonth = '2017-11'
)
, cte_201712 as (
  select * from cte where mmonth = '2017-12'
)
, cte_201801 as (
  select * from cte where mmonth = '2018-01'
)
, cte_cnt201712 as(
         select cte_201711.mmonth as mm201711
              , cte_201711.iid    as id201711
              , cte_201712.mmonth as mm201712
              , cte_201712.iid    as id201712
           from cte_201711
full outer join cte_201712
             on cte_201712.iid = cte_201711.iid
)
, cte_cnt201801 as (
         select cte_201711.mmonth as mm201711
              , cte_201711.iid    as id201711
              , cte_201712.mmonth as mm201712
              , cte_201712.iid    as id201712
              , cte_201801.mmonth as mm201801
              , cte_201801.iid    as id201801
           from cte_201711
full outer join cte_201712
             on cte_201712.iid = cte_201711.iid
full outer join cte_201801
             on cte_201801.iid = cte_201712.iid
             or cte_201801.iid = cte_201711.iid
)

--select * from cte_cnt201801 order by isnull(mm201711,'z'), isnull(mm201712,'z')

    select '2017-12' mmonth, count(*) Ssiu
      from cte_cnt201712
     where mm201711 is null
union all
    select '2018-01' mmonth, count(*) Ssiu
      from cte_cnt201801
     where mm201711 is null
       and mm201712 is null

enter image description here

以上查询的结果是: enter image description here