首先,描述我的数据集。我正在使用SNOMED CT代码,并试图从中创建一个可用的列表。相关列是rowId、conceptID和Description。rowId是唯一的,其他两个不是。我想从这些代码中选择一个非常具体的子集:

SELECT *
  FROM SnomedCode
  WHERE LENGTH(Description)=MIN(LENGTH(Description))
  GROUP BY conceptID

结果应该是一个400000个唯一概念ID的列表(140万个)和每个代码最短的适用描述。上面的查询显然格式不正确(并且只返回长度(description)=1的行,因为表中最短的描述长度为1个字符。)我缺少什么?

最佳答案

SELECT conceptID, MAX(Description)
  FROM SnomedCode A
 WHERE LENGTH(Description)=(SELECT MIN(LENGTH(B.Description))
                              FROM SnomedCode B
                             WHERE B.conceptID = A.conceptID)
 GROUP BY conceptID

实际上并不需要“GROUP BY”和“MAX(Description)”,而是添加了一个用于不同描述的tiebreaker,对于conceptID,长度相同,因为需求包括唯一的conceptID。
麦克斯被选中惩罚可能的领先空间。否则MIN(描述)也可以工作。
顺便说一下,如果您有超过一百万条记录,那么这个查询需要相当长的时间。用WHERE子句中添加的“和conceptID in(要测试的conceptID列表)”测试它。
SnomedCode表必须有conceptID上的索引。否则,查询将永远进行。

09-27 14:58