【问题标题】:Returning data where dates are at least 7 days apart返回日期至少相隔 7 天的数据
【发布时间】:2019-03-23 07:34:55
【问题描述】:

我有兴趣在 Microsoft SQL Server 查询中仅保留在两个不同日期的值超过特定阈值的个人。如果个人两次得分高于 150 并且第二次约会在第一次约会后至少 7 天,我想返回他们的 ID、第二次得分高于 150 的日期以及第二次约会的分数。

这是数据:

SubjectID   DATE         Score
001         01/11/2014   147
001         02/11/2013   151
002         02/10/2015   152
003         08/12/2013   155
002         01/31/2012   159
003         07/19/2016   157

所以我对于结果,我想返回以下内容:

SubjectID   DATE         Score
002         02/10/2015   152
003         07/19/2016   157

根据我之前提出的问题,我使用以下代码返回第二个日期:

 SELECT *
    FROM Clinic a
    WHERE a.score > 150 
          AND a.date IN (SELECT MAX(b.date) 
                         FROM Clinic b 
                         WHERE b.subjectId = a.subjectId 
                                AND b.score > 150)

我想我需要在 WHERE 语句中添加如下内容:

AND (b.date - a.date) > 7;

【问题讨论】:

  • 什么版本的sql server? 2008 年、2012 年、2016 年? 2012 年以后允许lag

标签: sql sql-server date sql-server-2017


【解决方案1】:

只需使用lag():

select c.*
from (select c.*, lag(date) over (partition by c.subjectid order by c.date) as prev_date
      from clinic c
      where c.score > 150
     ) c
where date > dateadd(day, 7, prev_date);

您也可以使用相关子查询来解决此问题:

select c.*
from clinic c
where c.score > 150 and
      c.date > (select dateadd(day, 7, c2.date)
                from clinic c2
                where c2.subjectid = c.subjectid and c2.score > 150
               );

【讨论】:

  • 我在运行您的代码时收到以下错误:子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。
  • 我认为我需要考虑重复的日期。例如,如果 01/01/2018 是第二个日期并且被多次列出,则会出现错误。如果日期被多次列出,我们如何只返回一个日期?
  • @statsguyz 。 . .如何在同一天的多行中进行选择?有最新的时间戳吗?
  • 在创建临时表之前有。现在我只有多行具有相同的主题 ID 和日期(不再有任何时间戳)。我想我可以在运行任何这些解决方案之前删除重复的行。
【解决方案2】:

LAG 是要走的路。但以防万一您想完成原始查询:

SELECT *
FROM Clinic AS curr
WHERE Score > 150 
AND Date >= (
    SELECT DATEADD(DAY, 7, MAX(Date)) -- maximum date + 7 days
    FROM Clinic AS prev
    WHERE SubjectID = curr.SubjectID
    AND Date < curr.Date -- prev dates
    AND Score > 150
)

DB Fiddle

【讨论】:

  • 应该 curr.SubjectID 是 prev.SubjectID 和 curr.Date 是 prev.Date 吗?我都遇到了错误,但是当我将 curr 更改为 prev 时,两个错误都消失了。
  • @statsguyz 我稍微修改了查询并添加了测试小提琴。
  • 如果日期是同一天,您的代码将返回副本。例如,如果日期被列出两次,它将返回两行,每行都有相同的日期。如何删除复制行?
  • 结果在技术上是正确的。从我的头顶尝试添加AND NOT EXISTS (SELECT 1 FROM Clinic AS same WHERE SubjectID = curr.SubjectID AND Date = curr.Date AND ID &gt; curr.ID),如果有平局,它将返回具有最高ID的行@statsguyz
  • 感谢您的评论。我添加了解决问题的 DISTINCT 关键字。
猜你喜欢
  • 2021-08-10
  • 2020-10-08
  • 1970-01-01
  • 1970-01-01
  • 2021-06-28
  • 2012-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多