Ah. My purpose is to determine "d for the most recent c with b=1",
with "most recent" being "largest a".

My query had been working for this, but I'd only been adding
monotonically increasing values for "a" in my tests. I just tried
doing otherwise and found that I had been relying on an implementation
detail.

Is there any way I can perform this collation at query time, or do I
need to do it programmatically later on?

Thanks,
Hamish





On 3 April 2017 at 00:41, Keith Medcalf <kmedc...@dessus.com> wrote:
>
> What is the purpose of the ORDER BY?
>
> The value of a used for the order by is from some random row in the grouping 
> of c.  Are there relationships between a, b, c, d that you have not 
> documented nor told us about?
>
> In any case, your most efficient index is on (b, c).
>
> The order by is useless.
>
>> -----Original Message-----
>> From: sqlite-users [mailto:sqlite-users-boun...@mailinglists.sqlite.org]
>> On Behalf Of Hamish Allan
>> Sent: Sunday, 2 April, 2017 17:28
>> To: sqlite-users@mailinglists.sqlite.org
>> Subject: [sqlite] Indexing WHERE with GROUP BY and ORDER BY
>>
>> Given a table:
>>
>> CREATE TABLE x (a INT, b INT, c TEXT, d TEXT);
>>
>> the query:
>>
>> SELECT d FROM x WHERE b = 1 GROUP BY c ORDER BY a;
>>
>> shows the following plan, without indexes:
>>
>> 0|0|0|SCAN TABLE x
>> 0|0|0|USE TEMP B-TREE FOR GROUP BY
>> 0|0|0|USE TEMP B-TREE FOR ORDER BY
>>
>> I can create an index to cover the WHERE clause:
>>
>> CREATE INDEX b_index ON x (b);
>>
>> which gives the plan:
>>
>> 0|0|0|SEARCH TABLE x USING INDEX b_index (b=?)
>> 0|0|0|USE TEMP B-TREE FOR GROUP BY
>> 0|0|0|USE TEMP B-TREE FOR ORDER BY
>>
>> or I can create an index to cover the GROUP BY clause:
>>
>> DROP INDEX b_index;
>> CREATE INDEX c_index ON x (c);
>>
>> which gives the plan:
>>
>> 0|0|0|SCAN TABLE x USING INDEX c_index
>> 0|0|0|USE TEMP B-TREE FOR ORDER BY
>>
>> but I don't seem to be able to create a combined index to cover both
>> the WHERE and GROUP BY clauses (let alone the ORDER BY clause).
>>
>> Am I missing something, or is this just not possible?
>>
>> If it's not possible, which is the more efficient of those indexes  --
>> or is there a third way, using an index for the ORDER BY, which would
>> be more efficient still?
>>
>> Thanks,
>> Hamish
>> _______________________________________________
>> sqlite-users mailing list
>> sqlite-users@mailinglists.sqlite.org
>> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
>
>
>
> _______________________________________________
> sqlite-users mailing list
> sqlite-users@mailinglists.sqlite.org
> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
_______________________________________________
sqlite-users mailing list
sqlite-users@mailinglists.sqlite.org
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to