我有一个与Trans-SQL相关的问题,涉及计算列的总结。
我遇到了重复计算这些计算值的问题。
通常我会提取所有原始数据并在Perl中对其进行后处理,但由于我们需要使用特定的报告系统,我不能在这种情况下这样做。我对SQL的复杂性相对缺乏经验,所以我想我会把它提交给专家。
我的数据安排在下表中(为了清楚起见,高度简化和简化):
Patient
表:
Course
表
Diagnosis
表
Plan
表
Field
表
我想要做的是找到FieldTable中FieldDateTime中日期范围内的最大分数和最小分数之间的差异。我想将这些值与可能的与课程相关的计划ID相加,但我不想重复计算我可能遇到的两个特定诊断ID(A或B或两者)。
因此,对于具有两个诊断代码(A和B)且在同一疗程(Plan1和Plan2)中有两个计划的患者,第一个计划的分数为24,第二个计划的分数为5我想出去是这样的:
- **PatientId CourseId PlanId DiagnosisId FractionNumberDiff Sum
- AB1234 1 Plan1 A 24 29
- AB1234 1 Plan1 B * *
- AB1234 1 Plan2 A 5 *
- AB1234 1 Plan2 B * *
我绞尽脑汁想如何做到这一点,我尝试了以下几点:
SELECT
Patient.PatientId,
Course.CourseId,
Plan.PlanId,
MAX(fractionnumber OVER PARTITION(Plan.PlanSer)) - MIN(fractionnumber OVER PARTITION(Plan.PlanSer)) AS FractionNumberDiff,
SUM(FractionNumberDiff OVER PARTITION(Course.CourseSer)
FROM
Patient P
INNER JOIN
Course C ON (P.PatientSer = C.PatientSer)
INNER JOIN
Plan Pl ON (Pl.CourseSer = C.CourseSer)
INNER JOIN
Diagnosis D ON (D.PatientSer = P.PatientSer)
INNER JOIN
Field F ON (F.PlanSer = Pl.PlanSer)
WHERE
FieldDateTime > [Start Date]
AND FieldDateTime < [End Date]
但这只是对诊断代码的重复计算,这意味着我最终得到的是58而不是29。
关于我能做什么的任何想法?
答案 0 :(得分:0)
将FractionNumberDiff更改为
MAX(fractionnumber) OVER (PARTITION BY Plan.PlanSer) -
MIN(fractionnumber) OVER (PARTITION BY Plan.PlanSer) AS FractionNumberDiff
并删除“SUM(FractionNumberDiff OVER PARTITION(Course.CourseSer)”
将exisitng查询作为派生表进行计算并计算SUM(FractionNumberDiff)
SELECT *, SUM(FractionNumberDiff) OVER ( PARTITION BYCourse.CourseSer)
FROM
(
< the modified existing query here>
) AS d
关于重复计算问题,请发布一些样本数据和预期结果