使用 SQL 聚合函数定义的日期范围进行过滤

问题描述 投票:0回答:1

我有一个大型数据库,其中的行可以链接到个人,可以将一行或多行识别为属于同一事件,此外一个人可能有多个事件。 我找不到正确的方法来声明要返回哪些数据项并正确指定我的选择周围的日期过滤器。我使用的是 SQL select 语句,该语句实际上嵌入在 R 脚本中运行,但我不确定这是否重要 - 我已经超出了使用 SQL 的舒适区。

对于每个 event_id,我需要知道个体、event_id、第一个开始日期、最后一个结束日期、第一个类型、第一个样本、最小年龄的不同值 - 数据集必须按几个字段进行排序,以确保首先提取的正确顺序记录。

我想将以下过滤器应用于我的数据集,其中第一个“类型”介于 20-22 或 30-39 之间,最小年龄 >=65,最大结束日期介于“2019 年 4 月 1 日”和“2020 年 3 月 31 日”之间 这是数据过滤器给我带来的问题。

下面是我的数据集的示例

example dataset

我几乎可以使用下面的 SQL 选择来实现我想要的目标,但是我不知道如何/在哪里基于 max(end_date) 在日期范围内添加过滤器。

SELECT distinct individual, event_id,
            min(start_date) OVER (PARTITION BY individual, event_id) dstart,
            max(end_date) OVER (PARTITION BY individual, event_id) dend,
            min(age) OVER (PARTITION BY individual, event_id) age,
            FIRST_VALUE(sample) OVER (PARTITION BY individual, event_id ORDER BY individual, start_date, end_date, sort1, sort2,sort3) sample,
            FIRST_VALUE(type) OVER (PARTITION BY individual, event_id ORDER BY individual, start_date, end_date, sort1, sort2,sort3) adm_type
   FROM ANALYSIS.TABLE z
   WHERE
    exists (
      select * from ANALYSIS.TABLE where individual=z.individual and event_id=z.event_id
                                    and (type between '20' and '22' or type between '30' and '39'))
      AND AGE >64
     ORDER BY individual, event_id

如有任何建议,我们将不胜感激

select aggregate-functions datefilter
1个回答
0
投票

您的某些过滤器适用于计算值,并且在使用

over()
子句时,您不能在 where 子句的同一“级别”中使用这些过滤器。也就是说,您需要将查询“嵌套”一层,然后您可以通过列别名来引用这些计算列,例如
age > 64

SELECT
    *
from (
    SELECT
          individual
        , event_id
        , row_number() OVER (PARTITION BY individual, event_id)     rm
        , min(start_date) OVER (PARTITION BY individual, event_id)  dstart
        , max(end_date) OVER (PARTITION BY individual, event_id)    dend
        , min(age) OVER (PARTITION BY individual, event_id)         age
        , FIRST_VALUE(sample) OVER (PARTITION BY individual, event_id
                                    ORDER BY individual, start_date, end_date, sort1, sort2, sort3) sample
        , FIRST_VALUE(type) OVER (PARTITION BY individual, event_id 
                                    ORDER BY individual, start_date, end_date, sort1, sort2, sort3) adm_type
    FROM ANALYSIS.TABLE z
    WHERE EXISTS (
        select * 
        from ANALYSIS.TABLE 
        where individual = z.individual 
        and event_id = z.event_id
        and (type between '20' and '22' or type between '30' and '39')
        )
    ) d
WHERE rn = 1
AND AGE > 64
AND dend BETWEEN '2019-04-01' and '2020-03-31'
ORDER BY
      individual
    , event_id

我已将内部查询保留为使用

where exists
子查询,因为我不确定您是否希望开始/结束日期或年龄仅受这些类型的限制,或者是否希望开始/结束日期和年龄受那些类型的限制至少参与过这些类型。

另外,我不确定您是否真的需要“选择不同的”,但我使用

row_number() over()
作为替代方法来确保每个人只获得一行 event_id。我怀疑这比对结果的所有列进行排序以确定是否存在重复项更有效。

© www.soinside.com 2019 - 2024. All rights reserved.