【问题标题】:Select row with shortest string in one column if there are duplicates in another column?如果另一列中有重复项,则选择一列中字符串最短的行?
【发布时间】:2017-06-12 16:45:21
【问题描述】:

假设我有一个包含这样行的数据库

ID  PNR     NAME
1   35      Television
2   35      Television, flat screen
3   35      Television, CRT
4   87      Hat
5   99      Cup
6   99      Cup, small      

我想选择每种类型的物品(电视、帽子、杯子) - 但对于 PNR 中有多个条目的物品,我只想选择名称最短的那个。所以结果集是

ID  PNR     NAME
1   35      Television
4   87      Hat
5   99      Cup

如何使用 SQLite 构造这样的查询?甚至有可能,还是我需要在应用程序代码中进行此过滤?

【问题讨论】:

    标签: sql sqlite


    【解决方案1】:

    SQLite 3.7.11 起,可以use MIN() or MAX() to select a row in a group:

    SELECT ID,
           PNR,
           Name,
           min(length(Name))
    FROM MyTable
    GROUP BY PNR;
    

    【讨论】:

    • 实际上是否支持select ID, PNR, Name .... group by PNR,或者换句话说:在结果中将选择具有共同PNR 的组中的哪一行作为此PNR 的单行?如果ID=1 的行包含Television, flat,并且ID=2 的行包含Television,它也会起作用吗?
    • @StephanLechner 查看链接。
    • 这真的很方便。一个挑剔的旁注是“如果两个或多个输入行具有相同的最小值或最大值,仍然存在歧义”,但现在真的很挑剔:-)
    【解决方案2】:

    您可以使用MIN(length(name))-aggregate 函数找出几个名称的最小长度;稍微棘手的事情是将相应的IDNAME 放入结果中。以下查询应该可以工作:

    select mt1.ID, mt1.PNR, mt1.Name
    from MyTable mt1 inner join (
      select pnr, min(length(Name)) as minlength
      from MyTable group by pnr) mt2
      on mt1.pnr = mt2.pnr and length(mt1.Name) = mt2.minlength
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-27
      • 1970-01-01
      • 2020-01-01
      相关资源
      最近更新 更多