根据属性按降序分组的最佳方式是什么,而按照另一个属性按升序排序的最佳方式是什么。
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");现在,我想提出一个请求:
所以在这里我需要
prompt | value
10 | "z"
4 | "e"
6 | "c"
5 | "c"这怎麽可能?怎么才能使它不太低效呢?您是否可以避免中间请求(即从select中选择--我觉得这可能是实现它的方法,但不确定如何实现)。
更新:--我想出的最好方法是执行一个中间查询并使用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"发布于 2014-12-24 20:21:01
你可以试试:
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 minidSQLFiddle在这里。
发布于 2014-12-24 03:37:27
使用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.minidhttp://sqlfiddle.com/#!7/cac0b
https://stackoverflow.com/questions/27630239
复制相似问题