选择记录的第一个实例

12

我有一张表格,名为myTable,其中有两个字段IDpatientID。同一个patientID可能会在表格中出现多次,但其对应的ID不同。如何确保我只获取每个patientID一个实例?

编辑:我知道这不是完美的设计,但我需要从数据库中获取一些信息,然后稍后再进行修复。


有没有任何标准来决定要返回哪个记录,或者你想随机返回任何一个记录? - Panagiotis Kanavos
"top 1" 只返回一条记录。我需要每个患者ID的确切实例。无论留下哪个 tblClaims.id 都没有关系。 - wootscootinboogie
1
使用CTE的解决方案是正确的选择。 - Panagiotis Kanavos
4个回答

33

您可以使用带有ROW_NUMBER函数的CTE:

WITH CTE AS(
    SELECT myTable.*
    , RN = ROW_NUMBER()OVER(PARTITION BY patientID ORDER BY ID)
    FROM myTable 
)
SELECT * FROM CTE
WHERE RN = 1

5
如果可以的话,我会把这个答案点赞十次。 - AFract
很好的回答@TimSchmelter。也可以使用子查询来实现相同的输出:select * from ( SELECT myTable.* , RN = ROW_NUMBER()OVER(PARTITION BY patientID ORDER BY ID) FROM myTable ) as myPatient where RN = 1 - Syed

4

您好,看起来您正在寻找 DISTINCT

SELECT DISTINCT patientID FROM myTable

您可以通过使用GROUP BY获得相同的“效果”:
SELECT patientID FROM myTable GROUP BY patientID

不完全正确。患者ID可以在表格中出现多次,但tblclaims.id不同。因此,如果我选择distinct,那么会导致该患者ID返回多次。 - wootscootinboogie
只有在您添加更多字段到所选的投影中时,@wootscootinboogie 才能使用 DISTINCT 仅限于 patientID 来获得您需要的内容。如果您使用 DISTINCT patiendID, ID,那么是的,您将获得不同的组合,因此会有多个 patientID - Pavel Veller

-1

简单的方法是在查询语句的末尾添加LIMIT 1。这将确保结果集中仅返回一行。


在MSSQL中,它是“SELECT TOP 1...”。 - Pavel Veller
2
@PavelVeller:但我认为TOP 1不是OP要找的。他想要每个不同patientID的仅一条记录。 - Tim Schmelter
好的,所以LIMIT在MySQL和Drizzle中可用,但是SQL Server没有类似的功能吗?实际上,它有一个迂回的方法。您可以使用ROW_NUMBER()在子查询中设置查询,然后使用生成的行号限制选择。来源:http://blogs.msdn.com/b/sqlserver/archive/2006/10/25/limit-in-sql-server.aspx - Lady Serena Kitty

-1
WITH CTE AS
(
   SELECT tableName.*,ROW_NUMBER() OVER(PARTITION BY patientID ORDER BY patientID) As 'Position' FROM  tableName
)

SELECT * FROM CTE
WHERE
Position = 1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接