【问题标题】:How to find the number of occurences within a date range?如何查找日期范围内的出现次数?
【发布时间】:2021-09-17 01:17:15
【问题描述】:

假设我在 TestData 表中访问了医院

我想知道哪些患者在第一次就诊后的 7 天内第二次就诊。

如何在 SQL 中编写代码? 我有 Patient_id 作为 TEXT 日期是 date_visit 也是 TEXT 格式,格式为 MM/DD/YYYY

patient_id date_visit
A123B29133 07/12/2011
A123B29133 07/14/2011
A123B29133 07/20/2011
A123B29134 12/05/2016

在上表中,患者 A123B29133 符合 2011 年 7 月 14 日所见的条件,距 2011 年 7 月 12 日不到 7 天

【问题讨论】:

标签: sql sqlite


【解决方案1】:

您可以使用带有exists 的子查询:

with to_d(id, v_date) as (
    select patient_id, substr(date_visit, 7, 4)||"-"||substr(date_visit, 1, 2)||"-"||substr(date_visit, 4, 2) from visits
)
select t2.id from (select t1.id, min(t1.v_date) d1 from to_d t1 group by t1.id) t2
where exists (select 1 from to_d t3 where t3.id = t2.id and t3.v_date != t2.d1 and t3.v_date <= date(t2.d1, '+7 days'))
id
A123B29133

【讨论】:

    【解决方案2】:

    由于您的日期列不在 YYYY-MM-DD 中,这是几个 sqlite 日期函数使用的默认值,substr 函数用于将您的日期转换为这种格式。然后使用JulianDay 将您的日期转换为整数值,这将简化 7 天的比较。 MIN 窗口函数用于确定该患者的第一次医院就诊日期。演示小提琴和示例显示了用于在最终查询之前转换数据和结果的查询,最终查询根据您的要求进行过滤,即&lt; 7 days。通过这种使用窗口函数的方法,如果需要,您还可以检索 visit_date 和自首次访问日期以来的天数。

    您可以阅读有关 sqlite 日期函数的更多信息here

    查询 #1

    SELECT
        patient_id,
        visit_date,
        JulianDay(visit_date) - 
        MIN(JulianDay(visit_date)) OVER (PARTITION BY patient_id)
         as num_of_days_since_first_visit
    FROM
        (
            SELECT 
                *,
                (
                  substr(date_visit,7) || '-' ||
                  substr(date_visit,0,3) || '-' ||
                  substr(date_visit,4,2)
                ) as visit_date
            FROM
                visits
        ) v;
    
    patient_id visit_date num_of_days_since_first_visit
    A123B29133 2011-07-12 0
    A123B29133 2011-07-14 2
    A123B29133 2011-07-20 8
    A123B29134 2016-12-05 0

    查询 #2

    以下是您想要的查询,它使用前一个查询作为 CTE,并对少于 7 天的访问应用过滤器。 num_of_days &lt;&gt; 0 用于删除第一个日期也是记录日期的条目。

    WITH num_of_days_since_first_visit AS (
    SELECT
        patient_id,
        visit_date,
        JulianDay(visit_date) - MIN(JulianDay(visit_date)) OVER (PARTITION BY patient_id) num_of_days
    FROM
        (
            SELECT 
                *,
                (
                  substr(date_visit,7) || '-' ||
                  substr(date_visit,0,3) || '-' ||
                  substr(date_visit,4,2)
                ) as visit_date
            FROM
                visits
        ) v
    )
    SELECT DISTINCT
        patient_id
    FROM
        num_of_days_since_first_visit
    WHERE
        num_of_days <> 0 AND num_of_days < 7;
    
    patient_id
    A123B29133

    View on DB Fiddle

    让我知道这是否适合你。

    【讨论】:

      【解决方案3】:

      我想知道哪些患者在首次就诊后的 7 天内第二次就诊。

      您可以使用lag()。以下获取所有符合条件的行:

      select t.*
      from (select t.*,
                   lag(date_visit) over (partition by patient_id order by date_visit) as prev_date_visit
            from t
           ) t
      where prev_date_visit >= date(date_visit, '-7 day');
      

      如果你只想要patient_ids,你可以使用select distinct patient_id

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-09
        • 2016-09-22
        • 2016-10-08
        • 1970-01-01
        • 2011-01-06
        • 1970-01-01
        • 1970-01-01
        • 2017-07-14
        相关资源
        最近更新 更多