如何返回过去 90 天内没有活动日期的记录?

Posted

技术标签:

【中文标题】如何返回过去 90 天内没有活动日期的记录?【英文标题】:How to return records with no activity date in the last 90 days? 【发布时间】:2020-09-25 18:09:42 【问题描述】:

我有一个查询要返回过去 90 天内没有活动的所有记录,但它似乎也返回了过去 90 天内活动的记录。我该如何解决这个问题?

我检查它们是否处于活动状态的逻辑 - tm.timeslip_date <= DATEADD(day, -90, GETDATE()) 我认为如果它们在过去 90 天内不活动,这会做任何事情。这可能很容易解决,但我现在很难过。

WITH unit AS (
   SELECT
         tm.create_date 
       , tm.timeslip_date
       , cases.case_sk
       , cases.case_number
       , cases.closed_ind
       , cases.atty2_sk
       , vc.atty2_name    AS [Business Leader]
       , em.smtp_reply_to AS [Business Leader Email]
       , cases.atty1_sk
       , vc.atty1_name    AS [Assign Attorney]
       , tm.detail_notes
   FROM dbo.cases
   LEFT JOIN dbo.vcases vc ON cases.case_sk = vc.case_sk
   LEFT JOIN dbo.employee em ON cases.atty2_sk = em.employee_sk    
   LEFT JOIN dbo.timeslips tm 
         ON cases.case_sk = tm.case_sk
         AND tm.timeslip_date <= DATEADD(day, -90, GETDATE()) -- This where I check last 90 days no timeslip dates** 
   WHERE cases.closed_ind = 'O'

      
), agg AS (
   SELECT
         MIN(u.create_date)   AS [Created Date]
       , MAX(u.timeslip_date) AS [Last Bill Date]
       , u.case_sk
       , u.case_number
       , u.closed_ind
       , u.atty2_sk
       , u.[Business Leader]
       , u.[Business Leader Email]
       , u.atty1_sk
       , u.[Assign Attorney]
   FROM unit u
   GROUP BY 
         u.case_sk
       , u.case_number
       , u.closed_ind
       , u.atty2_sk
       , u.[Business Leader]
       , u.[Business Leader Email]
       , u.atty1_sk
       , u.[Assign Attorney]
)
SELECT agg.*, unit.detail_notes
FROM agg
INNER JOIN unit
   ON  agg.[Last Bill Date] = unit.[timeslip_date]
        AND agg.case_sk = unit.case_sk
        AND agg.case_number = unit.case_number
        AND agg.closed_ind = unit.closed_ind
        AND agg.atty2_sk = unit.atty2_sk
        AND agg.atty1_sk = unit.atty1_sk
WHERE agg.case_sk ='66505'
ORDER BY agg.[Created Date] ASC

所以下面这个案例不应该拉,因为它在过去 90 天内有活动

【问题讨论】:

AND tm.timeslip_date &lt;= DATEADD(day, -90, GETDATE()) -- “这是我检查过去 90 天的地方,没有时间间隔日期” -- 不,你没有检查。这是LEFT JOIN 中的谓词,因此它不会删除行;它只是不加入他们。如果要过滤掉行,则需要将条件放在WHERE 子句中,而不是ON 子句中。 请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出尽可能少的代码,即您显示的代码可以通过您显示的代码扩展为不正常的代码。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)和输入为格式化为表的代码的 SQL。 How to Ask 暂停总体目标的工作,将代码砍到第一个表达式,没有给出你期望的内容,说出你的期望和原因。 请use text, not images/links, for text--including tables & ERDs。仅将图像用于无法表达为文本或增强文本的内容。在图片中包含图例/键和说明。 @TheImpaler,谢谢你的信息 @philipxy 谢谢你的信息。下次我会关注这些。 【参考方案1】:
...............   
LEFT JOIN dbo.timeslips tm 
         ON cases.case_sk = tm.case_sk
         --AND tm.timeslip_date <= DATEADD(day, -90, GETDATE()) -- This where I check last 90 days no timeslip dates** 
   WHERE cases.closed_ind = 'O'
   AND NOT EXISTS(SELECT * FROM dbo.timeslips tsm WHERE tsm.case_sk = cases.case_sk AND tsm.timeslip_date > DATEADD(day, -90, GETDATE()) )
.........................

【讨论】:

非常感谢。我占用了你的帮助。它有效。

以上是关于如何返回过去 90 天内没有活动日期的记录?的主要内容,如果未能解决你的问题,请参考以下文章

根据日期(过去 30 天)获取记录 [重复]

MySql 我如何返回过去 60 天和不在 60 天内的多个特定 ID?

为啥推迟开始日期会导致 Google Analytics(分析)报告查询返回 0 结果?

SQL 获取超过某个日期的记录,高于某个值,最小数量

LINQ 查询以获取过去 30 天的记录

如何循环消息