【问题标题】:how can I pull a list of years and the count of IDs who exist in a specific year but do not exist the year before?如何提取年份列表和特定年份存在但前一年不存在的 ID 数量?
【发布时间】:2020-07-13 22:13:38
【问题描述】:

应该是这样的

FISC_YR     COUNT_IDs
2020            ...
2019            ...
2018            ...
2017            ...
ect

这是只拉一年的代码

Select DISTINCT COUNT(A.APBCONS_PIDM) New_donors       
FROM APBCONS A
WHERE NOT EXISTS(SELECT 'gift before FY'
                 FROM AGBGIFT T1
                 WHERE T1.AGBGIFT_PIDM = A.APBCONS_PIDM
                 AND T1.AGBGIFT_FISC_CODE < 2020)
                 AND EXISTS (SELECT 'GIVEN THIS FY'
                             FROM AGBGIFT T2
                             WHERE T2.AGBGIFT_PIDM = A.APBCONS_PIDM
                             AND T2.AGBGIFT_FISC_CODE = 2020);

【问题讨论】:

  • 编辑您的问题并提供示例数据和所需的结果。

标签: sql oracle plsql


【解决方案1】:

在我们等待样本数据的同时,我编写了自己的数据(第 1 -15 行,因此可能有帮助的查询从第 16 行开始)。看看有没有帮助。

SQL> with test (fisc_yr, id) as
  2    (select 2017, 100 from dual union all
  3     select 2017, 101 from dual union all
  4     select 2017, 102 from dual union all -- 2017: result = 3
  5     --
  6     select 2018, 100 from dual union all -- 100 exists in year 2017
  7     select 2018, 200 from dual union all
  8     select 2018, 201 from dual union all -- 2018: result = 2
  9     --
 10     select 2019, 300 from dual union all -- 300 nor 301 exist in year 2018
 11     select 2019, 301 from dual union all -- 2019: result = 2
 12     --
 13     select 2020, 400 from dual           -- 2020: result = 1
 14    )
 15  --
 16  select a.fisc_yr,
 17         count(distinct a.id) count_ids
 18  from test a
 19  where not exists (select null
 20                    from test b
 21                    where b.fisc_yr = a.fisc_yr - 1
 22                      and b.id = a.id
 23                   )
 24  group by a.fisc_yr
 25  order by a.fisc_yr;

   FISC_YR  COUNT_IDS
---------- ----------
      2017          3
      2018          2
      2019          2
      2020          1

SQL>

【讨论】:

    【解决方案2】:

    您可以通过 LAG 分析功能满足您的要求。

    示例 SQL 供参考 -

    SELECT AGBGIFT_FISC_CODE, COUNT(DISTINCT APBCONS_PIDM) 
    FROM (SELECT AGBGIFT_FISC_CODE, APBCONS_PIDM
    FROM(SELECT APBCONS_PIDM, AGBGIFT_FISC_CODE, LAG(AGBGIFT_FISC_CODE, 1) OVER(PARTITION BY APBCONS_PIDM ORDER BY AGBGIFT_FISC_CODE DESC) PREV_AGBGIFT_FISC_CODE FROM AGBGIFT T1 JOIN APBCONS A ON T1.AGBGIFT_PIDM = A.APBCONS_PIDM)
    WHERE(AGBGIFT_FISC_CODE - PREV_AGBGIFT_FISC_CODE ) != 1) 
    GROUP BY AGBGIFT_FISC_CODE ;
    

    【讨论】:

    • 由于某种原因,在 OVER(PARTITION BY APBCONS_PIDM ORDER BY AGBGIFT_FISC_CODE DESC) 中出现错误,指出它是无效标识符
    • 原因是,AGBGIFT 需要与 APBCONS 表连接才能访问其列。我已经更新了 SQl。请立即尝试
    猜你喜欢
    • 1970-01-01
    • 2017-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多