Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 获取具有另一列B的最大值的每个不同列A的行_Sql_Sqlite - Fatal编程技术网

Sql 获取具有另一列B的最大值的每个不同列A的行

Sql 获取具有另一列B的最大值的每个不同列A的行,sql,sqlite,Sql,Sqlite,我知道标题有点乱,但我现在就用白纸黑字来说明这个问题 我有一张这样的桌子: CREATE TABLE items ( item_id int primary key, item_type int, item_value int ); 实际的表有点不同,但为了理解,这是一个简化的版本 现在,我想在SELECT查询中得到的是对于每个不同的item_类型具有最大item_值的查询 我试过这样的方法: SELECT item_id, item_type,

我知道标题有点乱,但我现在就用白纸黑字来说明这个问题

我有一张这样的桌子:

CREATE TABLE items (
    item_id int primary key,
    item_type int,
    item_value int
);
实际的表有点不同,但为了理解,这是一个简化的版本

现在,我想在SELECT查询中得到的是对于每个不同的item_类型具有最大item_值的查询

我试过这样的方法:

SELECT item_id, 
       item_type, 
       item_value 
FROM   items 
GROUP  BY item_type 
ORDER  BY item_value DESC; 
这似乎起到了作用,但它需要很多年才能运行,我认为这完全是次优的。就这一点而言,对每种类型执行一个查询会更快,但我想知道是否有一种方法可以只在一个具有连接的查询中执行相同的操作


提前多谢

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


要使此查询有效,您需要在
项类型
列上创建索引。

标准SQL禁止此操作,但在SQLite 3.7.11或更高版本中,您可以使用MAX()从组中选择一行:


要使此查询有效,您需要在
项类型
列上建立索引。

CL建议的查询似乎花费了与我相同的时间(用.time on度量),尽管对我来说,他的查询看起来比我的查询更清晰

对于两个查询中的任何一个,仅索引项类型似乎并没有什么区别,最终有效的方法是创建一个包含以下三列的索引:

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

在那之后,速度提高了很多(从大约3秒到其他条件下的1/5秒)。

CL建议的查询似乎花费了与我相同的时间(用.time on来衡量),尽管对我来说,他的查询看起来比我的更清楚

对于两个查询中的任何一个,仅索引项类型似乎并没有什么区别,最终有效的方法是创建一个包含以下三列的索引:

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

在那之后,速度提高了很多(从大约3秒到其他时间的一半)。

样本数据和期望的结果将阐明“每个不同
项目类型的最高值”
”的含义。性能问题应包括
解释分析
和一些关于表大小的信息,索引、当前时间性能、期望时间等。
Slow
是一个相对术语,我们需要一个实际值进行比较。数据可能会有所不同。慢是相对的,事实上,我的意思是,我的查询可能是实现这一点的慢方法之一——如果不是最慢的话。最高值应更好地编辑为“最大项目价值”。我将对此进行编辑。请注意,此查询从每个组返回一个随机行。它只是碰巧起作用;如果表或索引结构或SQLite版本发生变化,这可能会发生变化。示例数据和期望结果将阐明“每个不同
项目类型的最高值”的含义。性能问题应包括
解释分析
,以及有关表大小、索引、当前时间性能、期望时间、,等等。
Slow
是一个相对术语,我们需要一个实际值来进行比较。数据可能会有所不同。慢是相对的,事实上,我的意思是,我的查询可能是实现这一点的慢方法之一——如果不是最慢的话。最高值应更好地编辑为“最大项目价值”。我将对此进行编辑。请注意,此查询从每个组返回一个随机行。它只是碰巧起作用;如果表或索引结构或SQLite版本发生更改,这可能会更改。谢谢。当我读到你的答案时,我已经创建了一个索引,索引中的三列分别是item_type、item_value、item_id和speed,它们的数量已经显著增加。当使用不带索引的查询时,您的查询和我的查询似乎花费了相似的时间。仅为item_类型编制索引似乎没有什么区别,但是像我这样创建一个包含item_类型、item_值和item_id的索引确实会大大提高速度。谢谢。当我读到你的答案时,我已经创建了一个索引,索引中的三列分别是item_type、item_value、item_id和speed,它们的数量已经显著增加。当使用不带索引的查询时,您的查询和我的查询似乎花费了相似的时间。只索引item_类型似乎没有什么区别,但是像我一样创建一个包含item_类型、item_值和item_id的索引确实会大大提高速度;这通常不值得每一个查询。谢谢你的信息。这是一个;这通常不值得每一个查询。谢谢你的信息。