首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >选择,根据一个属性desc进行分组。并根据另一个asc进行排序

选择,根据一个属性desc进行分组。并根据另一个asc进行排序
EN

Stack Overflow用户
提问于 2014-12-24 01:13:46
回答 2查看 234关注 0票数 0

根据属性按降序分组的最佳方式是什么,而按照另一个属性按升序排序的最佳方式是什么。

代码语言:javascript
复制
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排序(我不需要保留)

所以在这里我需要

代码语言:javascript
复制
prompt | value
   10  |  "z"
    4  |  "e"
    6  |  "c"
    5  |  "c"

这怎麽可能?怎么才能使它不太低效呢?您是否可以避免中间请求(即从select中选择--我觉得这可能是实现它的方法,但不确定如何实现)。

更新:--我想出的最好方法是执行一个中间查询并使用MIN操作符:

代码语言:javascript
复制
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的升序进行整个排序。

代码语言:javascript
复制
id  |prompt | value
 1  |   10  |  "z"
 2  |    4  |  "e"
 4  |    6  |  "c"
 5  |    5  |  "c"
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-24 20:21:01

你可以试试:

代码语言:javascript
复制
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在这里。

票数 1
EN

Stack Overflow用户

发布于 2014-12-24 03:37:27

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

代码语言:javascript
复制
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。

代码语言:javascript
复制
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对结果排序

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27630239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档