【问题标题】:Most efficient way to select 1st and last element, SQLite?选择第一个和最后一个元素的最有效方法 SQLite?
【发布时间】:2010-10-16 10:20:48
【问题描述】:

从 SQLite 的列中仅选择第一个和最后一个元素的最有效方法是什么?

【问题讨论】:

  • 请指定您使用的数据库品牌。例如。 MySQL、Microsoft SQL Server、Oracle 等
  • 只使用元素的名称。它们的实际存储顺序是一种抽象。

标签: sql sqlite select


【解决方案1】:

首先:文本列上的 MIN() 和 MAX() 给出 AAAA 和 TTTT 结果,它们不是我的测试表中的第一个和最后一个条目。它们是上面提到的最小值和最大值。

我在拥有超过 9400 万条记录的桌子上尝试了这个(使用 .stats ):

select * from
     (select col1 from mitable limit 1)
union 
select * from 
     (select col1 from mitable limit 1 offset
                             (select count(0) from mitable) -1);

但它会占用大量虚拟机步骤 (281,624,718)。

然后这更简单(如果表是在没有WITHOUT ROWID的情况下创建的)[sql关键字大写]:

SELECT col1 FROM mitable
WHERE ROWID = (SELECT MIN(ROWID) FROM mitable) 
   OR ROWID = (SELECT MAX(ROWID) FROM mitable);

在同一张桌子上运行了 55 个虚拟机步骤并产生了相同的答案。

【讨论】:

    【解决方案2】:

    我们可以借助Sql Aggregate 函数来做到这一点,例如MaxMin。这是两个聚合函数,可帮助您从数据表中获取最后一个元素和第一个元素。

    Select max (column_name ), min(column name) from table name
    

    【讨论】:

      【解决方案3】:

      min()/max() 方法是错误的。只有当值只是升序时,它才是正确的。我需要像这样的货币汇率,它是随机上升和下降的。

      这是我的解决方案:

      select st.*
      from stats_ticker st,
          (
              select min(rowid) as first, max(rowid) as last --here is magic part 1
              from stats_ticker
              -- next line is just a filter I need in my case. 
              -- if you want first/last of the whole table leave it out.
              where timeutc between datetime('now', '-1 days') and datetime('now')
              ) firstlast
      WHERE 
          st.rowid = firstlast.first     --and these two rows do magic part 2
          OR st.rowid = firstlast.last
      ORDER BY st.rowid;
      

      魔术第 1 部分: 子选择生成单行,列在前,最后包含 rowid。

      ma​​gic part 2很容易过滤这两个 rowid。

      这是迄今为止我提出的最佳解决方案。希望你喜欢。

      【讨论】:

        【解决方案4】:

        大概是这样的:

        SELECT dbo.Table.FirstCol, dbo.Table.LastCol FROM Table
        

        通过指定表名和架构,您可以获得较小的效率提升。

        【讨论】:

          【解决方案5】:

          行中的第一个和最后一个元素

          SELECT column1, columnN
          FROM mytable;
          

          我认为您必须指的是 列中的第一个和最后一个元素

          SELECT MIN(column1) AS First,
                 MAX(column1) AS Last
          FROM mytable;
          

          有关MIN()MAX(),请参阅http://www.sqlite.org/lang_aggfunc.html

          我使用FirstLast 作为列别名。

          【讨论】:

          • 确保该列上有索引
          • 是专栏,抱歉,还在睡觉
          • 谢谢,这行得通。我以前从未见过这样的声明。第一个和最后一个是sql函数?
          • First 和 Last 是列别名;这项工作由聚合函数 MIN() 和 MAX() 完成。
          • 很好的答案!有很多细节。
          【解决方案6】:

          如果只是一列:

          SELECT min(column) as first, max(column) as last FROM table
          

          如果要选择整行:

          SELECT 'first',* FROM table ORDER BY column DESC LIMIT 1
          UNION 
          SELECT 'last',* FROM table ORDER BY column ASC LIMIT 1
          

          【讨论】:

          • 在本例中,您使用first 表示最近的,对吗? order by DESC 给出了我测试中最近添加的元素。
          【解决方案7】:

          最有效的方法是知道这些字段的名称并简单地选择它们。

          SELECT `first_field`, `last_field` FROM `table`;
          

          【讨论】:

          • ¿WTF? column 中的第一个和最后一个 row,而不是该行的第一个和最后一个列。
          • @vartec 问题的最初表述是“从 SQL 的一行中仅选择第一个和最后一个元素的最有效方法是什么?”
          猜你喜欢
          • 2013-11-22
          • 1970-01-01
          • 1970-01-01
          • 2017-11-28
          • 2016-07-24
          • 2017-01-04
          • 1970-01-01
          • 2014-03-03
          • 1970-01-01
          相关资源
          最近更新 更多