Sqlite:选择,根据一个属性描述进行分组.并根据另一个ASC进行排序


根据

属性降序分组,但根据另一个属性按升序排序的最佳方法是什么?

CREATE TABLE IF NOT EXISTS
logs  (id INTEGER NOT NULL,
       prompt INTEGER NOT NULL,
       value TEXT,
PRIMARY KEY (id));
INSERT INTO logs(id, prompt, value) VALUES(1, 10, "a");
INSERT INTO logs(id, prompt, value) VALUES(2,  4, "a");
INSERT INTO logs(id, prompt, value) VALUES(3, 10, "b");
INSERT INTO logs(id, prompt, value) VALUES(4,  6, "c");
INSERT INTO logs(id, prompt, value) VALUES(5,  5, "c");
INSERT INTO logs(id, prompt, value) VALUES(6,  4, "d");
INSERT INTO logs(id, prompt, value) VALUES(7,  4, "e");
INSERT INTO logs(id, prompt, value) VALUES(8, 10, "a");
INSERT INTO logs(id, prompt, value) VALUES(9, 10, "z");

现在,我想要一个请求,它将:

  1. 根据提示进行分组(每个不同的提示只有一行)

  2. 仅保留具有最大 ID 的行的值

  3. 按升序 ID 排序(我不需要保留)

所以在这里我需要

prompt | value
   10  |  "z"
    4  |  "e"
    6  |  "c"
    5  |  "c"

这怎么可能?以及如何使其效率不低?您能否避免中间请求(即,从选择中选择 - 我觉得这可能是这样做的方法,但不确定如何做到)。

更新:我能想到的最好的方法是进行中间查询并使用 MIN 运算符:

SELECT MIN(id), prompt, lvalue
FROM logs
INNER JOIN
    (SELECT prompt as lprompt, value as lvalue
     FROM logs
     GROUP BY prompt ORDER BY id DESC)
ON
  prompt = lprompt
GROUP BY prompt ORDER BY id ASC;

它有效,但我不禁觉得这是一个糟糕的解决方案。

更新2:我想澄清一下,我想要出现提示的第一个id,以及出现提示的最后一个值;然后按第一个ID的升序进行整个排序。

id  |prompt | value
 1  |   10  |  "z"
 2  |    4  |  "e"
 4  |    6  |  "c"
 5  |    5  |  "c"

你可以试试:

select minid, lprompt, lvalue from
(SELECT prompt as lprompt, value as lvalue, min(id) as minid, max(id) as maxid
 FROM logs
 GROUP BY prompt ORDER BY id DESC) sq
order by minid

SQLFiddle here.

使用 not 存在来选择具有最大 id 的提示和值的查询

select prompt, value
from logs l1
where not exists (
    select 1 from logs l2
    where l2.prompt = l1.prompt
    and l2.id > l1.id
)
order by l1.id

或使用子查询直接选择每个提示的最大 ID

select prompt, value
from logs l1
where id = (
    select max(id) from logs l2
    where l2.prompt = l1.prompt
)
order by l1.id

选择与最大 id 绑定的提示值并按提示的最小 id 对结果进行排序

select t1.prompt, t2.value from (
  select prompt, min(id) minid, max(id) maxid
  from logs
  group by prompt
) t1 join logs t2 on t1.maxid = t2.id
order by t1.minid

http://sqlfiddle.com/#!7/cac0b

最新更新