【问题标题】:MySQL, Selecting based on subquery using MIN() and GROUP BYMySQL,使用 MIN() 和 GROUP BY 基于子查询进行选择
【发布时间】:2013-08-27 03:07:25
【问题描述】:

首先,描述一下我的数据集。我正在使用 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 个字符长。)我错过了什么?

【问题讨论】:

  • SQL Group By and min (MySQL) 的可能重复项
  • 您需要一个相关的子查询来计算 每个 conceptID 的最小值。另一个注意事项:尽管 mySQL 允许在 SELECT 字段中包含既不是 grouped by 也不是 aggregated 的字段,但就这些字段而言,此类查询的结果是不可预测的。所以不要SELECT *GROUP BY一起使用。

标签: mysql sql group-by subquery min


【解决方案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 长度,因为要求包括 唯一的概念ID。

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

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

表 SnomedCode 必须有一个关于 conceptID 的索引。否则,查询将永远持续。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    相关资源
    最近更新 更多