【问题标题】:Query returns incorrect result查询返回不正确的结果
【发布时间】:2016-06-07 21:42:01
【问题描述】:

MY 输入表是 Patient_ID 和 Appt_Resource_ID (Doctor)(第二个表只是获取患者姓名)

Patient_ID     Appt_Resource_ID
88299          47      
88299           1    
88299          40    
88299          40    
88299          40    
88299          40    

我正在运行一个 sql,旨在为患者 ID 和出现次数最多的 Doctor_ID 编写输出行,在本例中为 sb 40。但它输出 Doctor_ID 1。我检查的其他情况都正确。

这是查询:

select  distinct A.Patient_id,  P.Patient_name, b.Appt_resource_id
from [PM].[vwGenPatApptInfo] A
inner join 
(
select top 100 percent  patient_id, Appt_resource_id, count(Appt_resource_id) as DR_count,
row_number() over (partition by patient_id order by count(*) desc) as seqnum
from [PM].[vwGenPatApptInfo]
where Patient_ID is NOT NULL 
group by patient_id,Appt_resource_id
order by patient_id, seqnum 
) B   on B.Patient_ID = A.Patient_ID  
and  B.seqnum = 1 
inner join [PM].[vwGenPatInfo] P  on A.Patient_id = P.Patient_id
where A.Appt_DateTime >=   DATEADD(yyyy, -2, GETDATE()) and A.Appt_Cancelled_Date is NULL

但是结果是这样的:

Patient_ID         Appt_Resource_ID
88299                   1

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    试试这个。

    SELECT TOP 1 *
    FROM (
        SELECT Patient_ID, Appt_Resource_ID, COUNT(*) AS theCount
        FROM vwGenPatApptInfo
        GROUP BY Patient_ID, Appt_Resource_ID
        WHERE ApptDateTime >= DATEADD(yyyy, -2, GETDATE()) and Appt_Cancelled_Date is NULL
    ) b
    JOIN vwGenPatInfo p ON p.Patient_ID = b.Patient_ID
    ORDER BY theCount DESC
    

    【讨论】:

      【解决方案2】:

      这不是一个真正的答案,对不起。

      您的子查询查找患者最常出现的医生。 (如果您想要最常出现的患者/医生对,请从ROW_NUMBER 中删除分区子句。)

      但随后您再次加入 vwGenPatApptInfo(作为 A)。为什么?而且您的加入甚至是不完整的,因为您仅通过 Patient_ID 而不是 Appt_resource_id 加入。因此,您将每个最常出现的医生与特定日期范围内患者的其他医生记录相结合。这些你用DISTINCT 再次关闭。

      但是,我不明白您的查询是如何找到错误的医生的。如果您选择的是A.Appt_resource_id,那将是一个原因,但b.Appt_resource_id 应该是最常出现的医生。

      不过,我希望我上面的 cmets 对您有所帮助。也许您可以以某种方式简化您的查询,甚至可以摆脱错误。

      祝你好运!

      【讨论】:

        【解决方案3】:

        这可能不是最理想的解决方案,但试试这个:

        ;WITH CTE1 as (
            SELECT Patient_ID, Appt_Resource_ID
                , COUNT(*) OVER (PARTITION BY Patient_ID, Appt_Resource_ID) as CNT
            FROM [PM].[vwGenPatApptInfo]
        ), CTE2 as (
            SELECT Patient_ID, Appt_Resource_ID, CNT, RANK() OVER   
                (PARTITION BY Patient_ID ORDER BY CNT DESC) AS Rank 
            FROM CTE1
        ), CTE3 as (
            SELECT Patient_ID, Appt_Resource_ID, CNT, Rank 
            FROM CTE2
            WHERE Rank = 1
            GROUP BY Patient_ID, Appt_Resource_ID, CNT, Rank
        )
        select  distinct A.Patient_id,  P.Patient_name, b.Appt_resource_id, B.CNT
        from [PM].[vwGenPatApptInfo] A
        INNER JOIN CTE3 as B on B.Patient_ID = A.Patient_ID
        inner join [PM].[vwGenPatInfo] P  on A.Patient_id = P.Patient_id
        where A.Appt_DateTime >=   DATEADD(yyyy, -2, GETDATE()) and A.Appt_Cancelled_Date is NULL
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-03-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多