【问题标题】:Select the row with maximum/minimum value in SQLite在 SQLite 中选择具有最大值/最小值的行
【发布时间】:2017-12-17 01:57:30
【问题描述】:

根据the docs、常识和一些常见SQL 手册,max 函数只返回最大值。所以选择具有最大值的行的正确方法是子查询:

select * from `table` where `a`=(select max(`a`) from `table`);

效率低下。 SQLite中有argmax之类的东西吗?

【问题讨论】:

    标签: sql sqlite max aggregate-functions


    【解决方案1】:

    根据the docs,SQLite 允许使用max() 选择整行:

    SELECT *, max(a) FROM MyTable;
    

    (从3.7.11版本开始支持。)

    【讨论】:

    • 当在 Android Room 中使用它时,你会在构建过程中收到未使用的 MAX(...) 列的警告;最重要的是,如果表中没有行,DAO 似乎不会返回 null,而是返回具有所有默认字段值的对象。
    • 是的,我确认如果有可能找不到行,则不应将其与 Room 一起使用。如果发生这种情况,它会返回一行 NULL 列,这会为不支持空值的列生成异常。使用内连接更安全、更简洁,因为它不会添加 MAX 列。
    【解决方案2】:

    是的。只需使用

    select max(`a`), * from `table`;
    

    如果单行对您来说就足够了。其余值将属于取最大值所在的行。

    【讨论】:

      【解决方案3】:

      我没怎么用过SQLite,但我觉得

      select l.* from `table` l join (select * from `table` order by `a` desc limit 1) r on l.`a` = r.`a`;
      

      应该提供良好的性能。在a 上有一个索引应该会非常快。如果没有索引,它会导致对table 进行两次序列扫描。

      【讨论】:

        【解决方案4】:

        要获得多行,您的解决方案绝对不会效率低下——假设您索引列a,在这种情况下您可能应该这样做。

        create index myidx on mytable(a);
        

        【讨论】:

          猜你喜欢
          • 2019-08-05
          • 2014-12-01
          • 2018-08-24
          • 2021-07-23
          • 2021-09-10
          • 2020-09-09
          • 2021-08-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多