Sql 具有多个联接和子查询的最新记录值
我正在使用MS SQL Server 2016。我试图用row_number函数获取最近的测量值,但仍然获取多个记录,而不是最近的测量值。我有点超出了我的SQL舒适区,非常感谢您的帮助。是否可以在子查询中使用row_number函数Sql 具有多个联接和子查询的最新记录值,sql,sql-server,Sql,Sql Server,我正在使用MS SQL Server 2016。我试图用row_number函数获取最近的测量值,但仍然获取多个记录,而不是最近的测量值。我有点超出了我的SQL舒适区,非常感谢您的帮助。是否可以在子查询中使用row_number函数 SELECT DISTINCT V_PAT_FACT.PAT_ID, V_PAT_FACT.PAT_NAME, CAST(PATIENT.BIRTH_DATE as date) "BIRTH DATE", V_PAT_F
SELECT
DISTINCT
V_PAT_FACT.PAT_ID,
V_PAT_FACT.PAT_NAME,
CAST(PATIENT.BIRTH_DATE as date) "BIRTH DATE",
V_PAT_FACT.SEX_NAME as "GENDER",
V_PAT_FACT.CUR_PCP_NAME,
V_PAT_FACT.PAT_MRN_ID,
CAST(DATEADD(d,CAST(fmid7947.MEAS_VALUE as NUMERIC),'12/31/1840') as DATE) "RESTART DATE",
CAST(DATEADD(d,CAST(fmid7948.MEAS_VALUE as NUMERIC),'12/31/1840') as DATE) "INITIAL DATE",
FLOOR(CAST(LEFT(CAST(fmid7739.MEAS_VALUE as numeric), 4) AS numeric (8,3))/16) "INIT GOAL WT",
FLOOR(CAST(LEFT(CAST(fmid7912.MEAS_VALUE as numeric), 4) AS numeric (8,3))/16) "INIT RESTART WT",
fmid8794.MEAS_VALUE "TGT MAINT WT",
FLOOR(CAST(fmid14.MEAS_VALUE as numeric(8,3))/16) "WT LBS",
fmidBMI.MEAS_VALUE as "BMI",
FLOOR(CAST(LEFT(CAST(fmid8796.FSD_ID as numeric), 4) AS numeric (8,3))/16)"TOTAL LOSS",
fmid7752.MEAS_VALUE as "BARIATRIC MED"
FROM
V_PAT_FACT V_PAT_FACT
LEFT OUTER JOIN PATIENT ON V_PAT_FACT.PAT_ID = PATIENT.PAT_ID
INNER JOIN IP_FLWSHT_REC ON V_PAT_FACT.PAT_ID = IP_FLWSHT_REC.PAT_ID
INNER JOIN IP_FLWSHT_MEAS ON
IP_FLWSHT_REC.FSD_ID = IP_FLWSHT_MEAS.FSD_ID
AND
IP_FLWSHT_MEAS.FLT_ID = '343'
AND
IP_FLWSHT_MEAS.FLO_MEAS_ID IN ( '7947', '7948', '7739', '7912', '8794', '8481', '14', '301070', '8796','7752' )
INNER JOIN IP_FLO_GP_DATA ON IP_FLWSHT_MEAS.FLO_MEAS_ID = IP_FLO_GP_DATA.FLO_MEAS_ID
LEFT OUTER JOIN
(
SELECT
DISTINCT
mes.FLO_MEAS_ID,
mes.MEAS_VALUE,
vp.PAT_ID,
rsdate.MEAS_VALUE AS "something"
FROM
PAT_ENC vp
INNER JOIN IP_FLWSHT_REC rec on vp.PAT_ID=rec.PAT_ID
INNER JOIN IP_FLWSHT_MEAS mes on rec.FSD_ID=mes.FSD_ID
INNER JOIN (
SELECT
m.*,
row_number() over (partition by FSD_ID Order by ENTRY_TIME desc) as rn
FROM
IP_FLWSHT_MEAS m
WHERE
M.FLO_MEAS_ID = '7948'
) rsdate ON mes.FSD_ID = rsdate.FSD_ID
WHERE
mes.FLO_MEAS_ID ='7948'
) fmid7948 ON V_PAT_FACT.PAT_ID = fmid7948.PAT_ID
您定义了一个行号(在子选择中工作得非常好),但我不知道您在哪里使用它。仅仅添加一个行号列并不能神奇地完成任何事情,只能添加一个列供您在过滤器中使用。您可能还想研究公共表表达式(CTE),它们是语法上的糖分,使子选择更易于阅读。那个查询有点像维护噩梦。哈哈哈。。。谢谢你,鲍斯汀。这绝对是噩梦。。。我自己也很讨厌它,但我不需要维护它。只需要获取数据,将其放入Crystal命令对象中。我查看了CTE,但无法在sub中正确格式化。我在Where子句中添加了筛选器rn=1。。。。然而,当mes.FLO_表示ID='7948'和rn=1时,变化不大。一些记录在多个时间条目中拉入,而它们本应只拉入一个时间条目。