【发布时间】:2010-10-16 10:20:48
【问题描述】:
从 SQLite 的列中仅选择第一个和最后一个元素的最有效方法是什么?
【问题讨论】:
-
请指定您使用的数据库品牌。例如。 MySQL、Microsoft SQL Server、Oracle 等
-
只使用元素的名称。它们的实际存储顺序是一种抽象。
从 SQLite 的列中仅选择第一个和最后一个元素的最有效方法是什么?
【问题讨论】:
首先:文本列上的 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 个虚拟机步骤并产生了相同的答案。
【讨论】:
我们可以借助Sql Aggregate 函数来做到这一点,例如Max 和Min。这是两个聚合函数,可帮助您从数据表中获取最后一个元素和第一个元素。
Select max (column_name ), min(column name) from table name
【讨论】:
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。
magic part 2很容易过滤这两个 rowid。
这是迄今为止我提出的最佳解决方案。希望你喜欢。
【讨论】:
大概是这样的:
SELECT dbo.Table.FirstCol, dbo.Table.LastCol FROM Table
通过指定表名和架构,您可以获得较小的效率提升。
【讨论】:
行中的第一个和最后一个元素?
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。
我使用First 和Last 作为列别名。
【讨论】:
如果只是一列:
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 给出了我测试中最近添加的元素。
最有效的方法是知道这些字段的名称并简单地选择它们。
SELECT `first_field`, `last_field` FROM `table`;
【讨论】: