获取另一列B

时间:2016-04-01 19:38:35

标签: sql sqlite

我知道标题有点乱,但我现在会将问题显示为白色黑色。

我有一张像这样的表:

CREATE TABLE items (
    item_id int primary key,
    item_type int,
    item_value int
);

实际表格略有不同,但为了便于理解,这是一个简化版本。

现在,我想在SELECT查询中获得的是每个不同item_type具有最大item_value的那些。

我尝试过类似的事情:

SELECT item_id, 
       item_type, 
       item_value 
FROM   items 
GROUP  BY item_type 
ORDER  BY item_value DESC; 

这似乎可以解决问题,但它需要永久运行,我认为它完全不是最理想的。就此而言,为每种类型执行一次查询会更快,但我想知道是否有一种方法只在一个带有连接的查询中执行相同操作。

提前多多感谢!

2 个答案:

答案 0 :(得分:1)

标准SQL禁止这样做,但在SQLite 3.7.11或更高版本中,您可以从MAX()组中选择一行:

SELECT item_id,
       item_type,
       MAX(item_value) AS item_value
FROM items
GROUP BY item_type;

要使此查询更有效,您需要item_type列上的索引。

答案 1 :(得分:1)

CL提出的查询似乎花费的时间与我的相同(以.time为准),尽管对我来说,他的查询看起来比我的查询更清晰。

仅索引item_type似乎不会对两个查询中的任何一个产生影响,最终有效的方法是创建一个包含以下三列的索引:

CREATE INDEX idx_items_tvi ON items(item_type, item_value, item_id)

在此之后,速度提高了很多(从大约三秒钟到仅仅一半的其他条件不等)。