sql-server - 对多个连接的错误进行故障排除,其中一个表具有 group-by 语句中的变量的最小值
问题描述
我有一个 SQL 用户考试的练习题,要求我从四个不同的表的组合中返回三列,但我只及时返回分组语句中的患者 ID 的第一行。
这是我所拥有的:
select p.patient_nm as 'Patient Name', d.code as 'Diagnosis Code', convert(date, e.start_dts) as 'Encounter Date'
from
(with added_row_number as (select *, row_number() over(partition by patient_id order by start_dts) as row_number
from encounters
)
select encounter_id, patient_id, start_dts
from added_row_number
where row_number=1) e
left join edw_emr_ods.patients p
on e.patient_id=p.patient_id
left join edw_emr_ods.encounter_diagnoses ed
on e.encounter_id=ed.encounter_id
left join edw_emr_ods.diagnoses d
on ed.diagnosis_id=d.diagnosis_id
这部分代码似乎有问题,当我搜索有关如何仅返回“分组依据”组中的第一行的信息时,我从其他网站获得并改编了该代码
with added_row_number as (select *, row_number() over(partition by patient_id order by start_dts) as row_number
from encounters
)
select encounter_id, patient_id, start_dts
from added_row_number
where row_number=1
当我只运行这一部分时,我没有收到任何错误,它返回了加入其他三个表所需的最低限度,因此我可以返回三个必需的变量。这是我只运行那部分时的样子:
但这些是我在运行整个过程时遇到的错误:
Msg 156, Level 15, State 1, Line 280
Incorrect syntax near the keyword 'with'.
Msg 319, Level 15, State 1, Line 280
Incorrect syntax near the keyword 'with'. If this statement is a common table expression, an xmlnamespaces clause or a change tracking context clause, the previous statement must be terminated with a semicolon.
Msg 102, Level 15, State 1, Line 285
Incorrect syntax near ')'.
我试过插入一个单独的分号和几个不同的地方,但它们都不起作用。
此代码似乎应该是返回此表的计算效率最高的方法之一。
如果这不是要走的路,请让我知道最好的代码是什么,最好不使用临时表。
谢谢
编辑: 根据评论,我正在尝试将那段较小的代码更改为子查询,但仍然出现错误:
(select encounter_id, patient_id, start_dts, row_number() over(partition by patient_id order by start_dts) visitnum
from edw_emr_ods.encounters
where visitnum=1) e
产生错误:
Msg 207, Level 16, State 1, Line 298
Invalid column name 'visitnum'.
如果我省略 where 子句,子查询可以工作,但它会返回所有行,而我只需要 'visitnum' 等于 1 的那些行。
解决方案
with
是公用表表达式,不能在子查询中使用。只需将其转换为常规子查询即可。
并且您不能在与创建它相同的上下文中引用列别名,除了在order by
. 所以你需要一个额外的子查询/派生表。
(
select encounter_id, patient_id, start_dts
from (
select encounter_id, patient_id, start_dts, row_number() over (partition by patient_id order by start_dts) visitnum
from edw_emr_ods.encounters
) e1
where visitnum = 1
) e
推荐阅读
- python - 如何在python(熊猫)中将嵌套JSON格式的特定部分解析为csv
- python - Python - 当真:尝试除其他 - 程序流问题
- flutter - Flutter:flutter_swiper 包控制幻灯片之间的空间
- php - 不知道有多少参数时的准备语句
- python - 使用 SSH 在远程计算机上打开浏览器
- javascript - 选择下拉菜单项时自动从我的数据库中填写 textarea 字段
- javascript - 将字符串与正则表达式匹配时出错
- java - 用另一个类的实例字段影响一个类的实例字段
- javascript - Laravel如何根据查询按天渲染成融合图表
- c# - 在 IOptions .NET Core 1.1 及更高版本的延迟验证之上的单元测试自定义急切验证