Php 如何选择不同的ID,然后显示完整的行?

Php 如何选择不同的ID,然后显示完整的行?,php,sql-server,Php,Sql Server,正在搜索堆栈,但找不到特定的答案。我在医院工作,想让我们的日常生活更轻松。我们从放置的导管中收集数据,每天拜访患者一次或两次。我编写了一些php来存储SQL Server 2012中的这些信息。有一个表dbo.patients: |ID|PatientID|Station|Name |Catheter|Room|VisitDate|Visit ----------------------------------------------------------------------------

正在搜索堆栈,但找不到特定的答案。我在医院工作,想让我们的日常生活更轻松。我们从放置的导管中收集数据,每天拜访患者一次或两次。我编写了一些php来存储SQL Server 2012中的这些信息。有一个表dbo.patients:

|ID|PatientID|Station|Name  |Catheter|Room|VisitDate|Visit
-----------------------------------------------------------------------------
|1 |123456789|ACHI   |Muller|PDK     |12  |12.12.17 |all fine, nothing special
|2 |123456789|ACHI   |Muller|PDK     |12  |13.12.17 |catheter removed
|3 |234567891|GYN    |Meyer |PDK     |4   |04.07.17 |pain in the back, raised bolus
|4 |123456789|ACHI   |Muller|PDK     |12  |14.12.17 |no infection, dismiss
|5 |234567891|GYN    |Meyer |PDK     |4   |05.07.17 |still pain, raised up to 12
|6 |234567891|GYN    |Meyer |PDK     |4   |06.07.17 |non functional, removed
ID是数据库中的自动增量,而不是在表单中输入。 PatientID是医院的独特价值观。 所有其他列可能相同,例如每天10根导管,或所有导管=PDK,或两个名称相同,或它们共享同一个房间。。。。 每天大约有20个数据库入口

我的目标是,列出一份目前有导管的患者名单。因此,我需要所有列,但只需要最新的VisitDate—这意味着PatientID不允许出现两次。给定示例的输出应如下所示:

|ID|PatientID|Station|Name  |Catheter|Room|VisitDate|Visit
-----------------------------------------------------------------------------
|4 |123456789|ACHI   |Muller|PDK     |12  |14.12.17 |no infection, dismiss
|6 |234567891|GYN    |Meyer |PDK     |4   |06.07.17 |non functional, removed
我已经有了php中的表,显示了SELECT*FROM dbo.patients,但是我需要对其进行过滤,我不知道为什么。我试着选择DISTINCT,它很好地过滤了PatientID,但它只返回一列,我需要整行

通过searchingstackoverflow,我找到了类似的东西,并进行了尝试:

WITH t AS (
    SELECT ROW_NUMBER() OVER(
        PARTITION BY PatientID 
        ORDER BY VisitDate
    ) AS rnum,* 
    FROM dbo.patients
)
SELECT * FROM t a WHERE rnum IN (
        SELECT MAX(rnum) FROM t 
        GROUP BY PatientID 
        HAVING t.PatientID=a.PatientID
 )
它是有效的,但我不知道它是否合适,或者是否有人也有一个不那么复杂的想法。另外,如果他显示最新的条目,我真的不明白

提前谢谢


dirk

您可以使用以下行编号:

Select top (1) with ties * from yourtable
   order by row_number() over(partition by Patientid order by VisitDate desc)
+----+-----------+---------+--------+----------+------+------------+-------------------------+
| Id | PatientId | Station |  Name  | Catheter | Room | VistitDate |          Visit          |
+----+-----------+---------+--------+----------+------+------------+-------------------------+
|  4 | 123456789 | ACHI    | Muller | PDK      |   12 | 2017-12-14 | no infection, dismiss   |
|  6 | 234567891 | GYN     | Meyer  | PDK      |    4 | 2017-07-06 | non functional, removed |
+----+-----------+---------+--------+----------+------+------------+-------------------------+
您可以在外部查询中使用行号的其他方法:

Select * from (
   Select *, RowN = Row_number() over(partition by PatientId order by VisitDate desc) from yourtable ) a
   Where a.RowN = 1
输出如下:

Select top (1) with ties * from yourtable
   order by row_number() over(partition by Patientid order by VisitDate desc)
+----+-----------+---------+--------+----------+------+------------+-------------------------+
| Id | PatientId | Station |  Name  | Catheter | Room | VistitDate |          Visit          |
+----+-----------+---------+--------+----------+------+------------+-------------------------+
|  4 | 123456789 | ACHI    | Muller | PDK      |   12 | 2017-12-14 | no infection, dismiss   |
|  6 | 234567891 | GYN     | Meyer  | PDK      |    4 | 2017-07-06 | non functional, removed |
+----+-----------+---------+--------+----------+------+------------+-------------------------+

我使用了你的第一种方法-非常感谢,它很有效!但[名字]是什么意思?我刚刚删除了它,它仍然有效。您的姓名栏是的,但它在给定查询中的用途是什么?我需要它做什么?我想不出来。非常感谢你!是的,根据您的需求,PatientId本身的分区就足够了