SQL:如何选择每个唯一标识符的值最低的记录

Posted

技术标签:

【中文标题】SQL:如何选择每个唯一标识符的值最低的记录【英文标题】:SQL: How to select a record where the value is lowest per unique identifier 【发布时间】:2018-11-12 14:27:24 【问题描述】:

我是 SQL 新手,过去几天一直在寻找答案,但似乎找不到明确的答案。 (或者我不理解给出的解决方案,因为它们与我的场景不匹配)

我有一个类似于下面的表格:

unique reference|tel number| tel priority
123|0123456910|2
123|0654321910|6
214|0056897910|4

我只想输出每个唯一引用的电话号码优先级最低的数据,所以在上面的例子中我想要:

unique reference|tel number| tel priority
123|0123456910|2
214|0056897910|4

非常感谢任何指针/指导,我尝试了 MIN() 函数,但无法将其作为输出执行,所以我认为我遗漏了一些东西。

(我有 SQL server 2008 r2 或 Microsoft 报表生成器)

【问题讨论】:

为什么名称为“唯一引用”的列有重复项? 嗨,戈登,这是一张联系方式表。所以有多个具有相同唯一标识符的电话号码。 【参考方案1】:

这给出了你想要的结果:

SELECT * FROM phones WHERE tel_priority = (SELECT MIN(tel_priority) FROM phones p WHERE p.unique_reference = phones.unique_reference)

假设phones 是表的名称。 当然,如果对于给定的unique_reference,有超过 1 行包含tel_priority 的最小值,那么所有这些行都会被获取。

【讨论】:

【参考方案2】:

你可以使用row_number()

select t.*
from (select t.*, 
             row_number() over (partition by uniquereference order by priority) as seq
      from table t
     )
where seq = 1;

如果priority 有联系,则使用dense_rank() 而不是row_number()

【讨论】:

【参考方案3】:

这是简单的解决方案。我已经测试并且它工作正常。如果你喜欢这个答案,请投票

 select * from tablename where tel_priority not in(select max(tel_priority) from tablename)

【讨论】:

这恰好适用于给定的测试数据,但不适用于许多其他数据。它只删除数据库中的单个最高优先级,因此如果您有一条 id 为 214 且优先级为 3(或 6 以外的任何内容)的记录,它将同时显示它的记录。如果引用只有最高优先级的记录,则根本不会显示。

以上是关于SQL:如何选择每个唯一标识符的值最低的记录的主要内容,如果未能解决你的问题,请参考以下文章

如何每天为每个唯一标识符快速创建一行?

SQL:根据最近的日期选择一个字段中的值是唯一的记录

SQL 查询为其他列中的每个唯一条目返回最高和最低

在 Firebase 中使用 push() 时如何提取唯一 ID

仅当值存在于 SQL 的另一列中时,如何选择列的值?

如何使用 SQL 选择每个唯一日期的唯一会话?