30天内重新访问

时间:2016-01-20 15:40:36

标签: sql sql-server

我的主要问题是由splash58精心解答here但是我遇到了代码的问题,我认为还有另外一个问题(也就是说:解决方案已经产生了更多问题的怪物!)。

我有一个数据样本,从2014年7月1日到2014年12月31日。这是我最初的SQL查询:

SELECT 
  ADV.AcctNum
 ,ADV.Name
 ,ADV.HomePhoneNum
 ,ADV.ReasonForVisit
 ,ADV.ServiceDateTime
 ,ADI.ErDx
 ,PRV.PCP
 ,ADI.ErDispoID
 ,ADI.ErDispoName
 ,ADI.Dx

FROM Visits                    ADV
JOIN Discharge                 ADI  ON (ADI.VisitID  = ADV.VisitID AND
                                        ADI.SourceID = ADV.SourceID )
JOIN Providers                 PRV  ON (PRV.VisitID  = ADV.VisitID AND
                                        PRV.SourceID = PRV.SourceID )
WHERE ADV.ServiceDateTime BETWEEN '2014-07-01' AND '2014-12-31'          AND
  ADI.ErDispoName IS NOT NULL                               AND
( UPPER(ADV.ReasonForVisit) LIKE UPPER('%FLU%')             OR
  UPPER(ADV.ReasonForVisit) LIKE UPPER('%COLD%')            OR
  UPPER(ADI.ErDiagnosis) LIKE UPPER('%FLU%')                OR
  UPPER(ADI.ErDiagnosis) LIKE UPPER('%COLD%')               OR
  UPPER(ADI.Diagnosis) LIKE UPPER('%FLU%')                  OR
  UPPER(ADI.Diagnosis) LIKE UPPER('%COLD%'))                AND
ADV.FacilityID = '.' AND
ADV.Name LIKE '%SMITH%'
ORDER BY ADV.ServiceDateTime

这就是回归:

AccountNum  Name        HomePhoneNum    ReasonForVisit  ServiceDateTime ErDx                        PCP         ErDispoID       ErDispoName                  Dx
       1    SMITH,JOHN  999-999-9999    FLU             8/12/2014       FLU                         FORZ            AMA         *AGAINST MEDICAL ADVICE (07) NULL
       2    SMITH,JOHN  999-999-9999    Cold            8/23/2014       UPPER REPIRATORY INFECTION  FORZ            H           *HOME (01)                   NULL
       3    SMITH,JOHN  999-999-9999    COUGH           8/24/2014       FLU                         FORZ            H           *HOME (01)                   NULL
       4    SMITH,JOHN  999-999-9999    COUGH           10/29/2014      PNEMONIA                    FORZ            MSHH        *ADMIT TO HH (09)            Flu
       5    SMITH,JOHN  999-999-9999    COUGH           11/5/2014       FLU                         FORZ            H           *HOME (01)                   NULL 
       6    SMITH,JOHN  999-999-9999    FLU             11/7/2014       FLU                         FORZ            H           *HOME (01)                   NULL
       7    SMITH,JOHN  999-999-9999    Flu             11/8/2014       FLU                         FORZ            H           *HOME (01)                   NULL
       8    SMITH,JOHN  999-999-9999    FLU             12/13/2014      FLU                         FORZ            H           *HOME (01)                   NULL

注意ServiceDateTime字段。所以现在,我减少了代码(丢失了连接),以便我可以尝试使用其他问题的代码。见下文......

SELECT DISTINCT
  t1.AcctNum
 ,t1.UnitNum
 ,t1.Name
 ,t1.HomePhoneNum
 ,t1.ReasonForVisit
 ,t1.ServiceDateTime

FROM Visits t1
    Inner Join Visits t2    ON (t1.UnitNumber  = t2.UnitNumber   AND
                                t1.AccountNum != t2.AccountNum   AND
                                t1.ServiceDateTime > t2.ServiceDateTime AND
                 DATEDIFF(day, t1.ServiceDateTime, t2.ServiceDateTime) < 30)

WHERE t1.ServiceDateTime BETWEEN '2014-08-01' AND '2014-12-31'          AND
( UPPER(t1.ReasonForVisit) LIKE UPPER('%COLD%')                         OR
  UPPER(t1.ReasonForVisit) LIKE UPPER('%FLU%')                          OR
  UPPER(t1.ReasonForVisit) LIKE UPPER('%COUGH%'))                       AND
  t1.FacilityID = '.'                                                   AND
  t1.Name LIKE '%SMITH%'
当我想到这有效时,我感到非常兴奋,但不幸的是,有一个小缺陷。结果如下......

AccountNum  UnitNum  Name       HomePhoneNum    ReasonForVisit  ServiceDateTime 
       1     1234    SMITH,JOHN 999-999-9999    FLU             8/12/2014
       3     1234    SMITH,JOHN 999-999-9999    COUGH           8/24/2014
       5     1234    SMITH,JOHN 999-999-9999    COUGH           11/5/2014
       6     1234    SMITH,JOHN 999-999-9999    FLU             11/7/2014
       7     1234    SMITH,JOHN 999-999-9999    Flu             11/8/2014

我期待收回AccountNum“3,5,6和7”但不是数字1.为什么它返回账户1?此帐户在30天内没有访问过,因此应从此列表中删除。另外,如上所述,在这个新的查询中,由于我对SQL的了解有限,我不得不从原始查询中省略其他连接。这些是获取我需要的所有信息所必需的。

所以我需要知道为什么这个查询返回AccountNum“1”,(当我将日期范围更改为08/12/14之后它工作得很好),然后我需要帮助我的代码才能使用这个新查询包括第一个查询中的所有数据。

感谢您的帮助,如果需要澄清,请告诉我,我知道这是一个复杂的问题!

更新

请注意:我运行了以下查询,以便根据评论中的人的要求获取此人的“全部”访问次数。我甚至将查询从“2014-06-01”运行到“2014-12-31”以确定。

SELECT 
  AcctNum
 ,Name
 ,LocationID
 ,ServiceDateTime
 ,ReasonForVisit
FROM Visits 
WHERE ServiceDateTime BETWEEN '2014-06-01' AND '2014-12-31' AND
      UnitNum = '1234'
ORDER BY ServiceDateTime

2014-08-12之前没有任何访问,并且在该日期之后从我的其他查询中过滤掉的所有其他访问显然没有影响。见下文:

AccountNum  Name        ServiceDateTime
1           SMITH,JOHN  2014-08-12
2           SMITH,JOHN  2014-08-23
3           SMITH,JOHN  2014-08-24
100         SMITH,JOHN  2014-08-26
99          SMITH,JOHN  2014-09-03
98          SMITH,JOHN  2014-09-04
97          SMITH,JOHN  2014-09-12
96          SMITH,JOHN  2014-10-13
95          SMITH,JOHN  2014-10-21
94          SMITH,JOHN  2014-10-24
4           SMITH,JOHN  2014-10-29
5           SMITH,JOHN  2014-11-05
6           SMITH,JOHN  2014-11-07
7           SMITH,JOHN  2014-11-08
8           SMITH,JOHN  2014-12-13

所有90以上的帐户都显示 在日期范围内(但不是在2014-08-12之前)进行了其他访问,并且查询已正确筛选出来。

1 个答案:

答案 0 :(得分:4)

我相信DATEDIFF函数中参数的排序是倒退的,尽管仍然无法解释该行返回的原因。正如@Zach Ford所说,在不知道实际数据的情况下(与其他一些查询的结果相反),很难说。我的猜测是,UnitNumber的行有流感,咳嗽等,所以他们不会在原始查询中返回,但它们仍然存在于表格中仍会被INNER JOIN抓住。如果您要将这些条目排除在加入之外,那么您还需要将该条件添加到JOIN的{​​{1}}条款中。