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:如何选择每个唯一标识符的值最低的记录的主要内容,如果未能解决你的问题,请参考以下文章