1

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

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

结果应该是包含 400,000 个唯一概念 ID(共 140 万个)的列表以及每个代码的最短适用描述。上面的查询显然格式错误(并且只会返回 LENGTH(description)=1 的行,因为表中最短的描述是 1 个字符长。)我错过了什么?

4

1 回答 1

3
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)”并不是真正需要的,但是作为一个对conceptID具有相同长度的不同描述的决胜局,因为要求包括唯一的conceptID。

选择 MAX 是为了惩罚可能的前导空格。否则 MIN(Description) 也可以。

顺便说一句,如果您有超过一百万条记录,则此查询需要相当长的时间。使用WHERE 子句中添加的“AND conceptID in ( list-of-conceptIDs-to-test )”对其进行测试。

表 SnomedCode 必须在 conceptID 上有一个索引。如果没有,查询将永远进行。

于 2013-08-24T00:29:01.787 回答