查询中每位患者的访问次数

时间:2018-02-07 09:46:01

标签: sql sql-server tsql

我有这个问题:

SELECT  R.ID,
        R.clm_FirstName + ' ' + R.clm_Surname2 AS 'Name and surname',
        R.clm_Age2 AS 'Age',
        V.ID AS 'VISIT ID',
        CONVERT(varchar, V.clm_VisitDate, 103) AS 'Visit date',
        M.clm_BMI AS 'BMI'
FROM    tblData_Registration R
        INNER JOIN tblData_Visit V ON R.ID=V.RegistrationID
        INNER JOIN tblData_Measurements M ON V.ID=M.VisitID

给了我:

Query results:

我试图将VisitId编号为1,2,3 ....为每个不同的患者,但我陷入了僵局。不知道从哪里开始。有什么指针吗?

提前感谢一百万。 加夫:)

2 个答案:

答案 0 :(得分:3)

SELECT  R.ID,
        R.clm_FirstName + ' ' + R.clm_Surname2 AS 'Name and surname',
        R.clm_Age2 AS 'Age',
        V.ID AS 'VISIT ID',
        CONVERT(varchar, V.clm_VisitDate, 103) AS 'Visit date',
        M.clm_BMI AS 'BMI',
        ROW_NUMBER() OVER (PARTITION BY R.ID
                               ORDER BY V.clm_VisitDate,
                                        V.ID
                          )
                            AS clm_visit_number
FROM    tblData_Registration R
        INNER JOIN tblData_Visit V ON R.ID=V.RegistrationID
        INNER JOIN tblData_Measurements M ON V.ID=M.VisitID

ROW_NUMBER()将从1创建序列。

PARTITION BY R.ID表示每个R.ID都有单独的序列。

ORDER BY确定在分配顺序值时处理行的顺序。让V.clm_VisitDate,首先确保它们符合日期顺序。由于某些日期有多次访问,因此订购中还会添加一个附加字段; V.ID。这意味着,当同一日期(对于同一个人)进行多次访问时,V.ID最低的访问次序会获得最低的序列号。

答案 1 :(得分:2)

使用rank窗口功能来实现您的目标:)

SELECT  R.ID,
    R.clm_FirstName + ' ' + R.clm_Surname2 AS 'Name and surname',
    R.clm_Age2 AS 'Age',
    rank() over (partition by R.ID order by V.ID) AS 'VISIT ID',
    CONVERT(varchar, V.clm_VisitDate, 103) AS 'Visit date',
    M.clm_BMI AS 'BMI'
FROM    tblData_Registration R
    INNER JOIN tblData_Visit V ON R.ID=V.RegistrationID
    INNER JOIN tblData_Measurements M ON V.ID=M.VisitID
相关问题