【问题标题】:SQL: How to select a record where the value is lowest per unique identifierSQL:如何选择每个唯一标识符的值最低的记录
【发布时间】: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 报表生成器)

【问题讨论】:

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

标签: sql sql-server sql-server-2008-r2 reportbuilder3.0


【解决方案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 以外的任何内容)的记录,它将同时显示它的记录。如果引用只有最高优先级的记录,则根本不会显示。
      猜你喜欢
      • 2022-11-30
      • 2014-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-11
      • 1970-01-01
      相关资源
      最近更新 更多