【问题标题】:ORDER BY with PostgreSQL使用 PostgreSQL 排序
【发布时间】:2012-09-11 00:30:53
【问题描述】:

有没有一种方法可以通过您未在 select 子句中选择的内容对表格进行排序,例如:

Table Example

   Column  |    Type   |
-----------+-----------+
language   | character |
percentage | real      |
id         | integer   |

所以我想理想地做这样的事情

SELECT DISTINCT language FROM Example ORDER BY percentage DESC;

但这显然行不通。有没有一种方法可以让我按百分比对其进行排序,而无需在 SELECT 子句中实际选择百分比?

这个查询

SELECT DISTINCT language 
FROM countrylanguage 
ORDER BY percentage DESC; 

给出这个错误信息:

ERROR: for SELECT DISTINCT, ORDER BY expressions must appear in select list
LINE 1: ...T DISTINCT language FROM countrylanguage ORDER BY percentage...

【问题讨论】:

  • SELECT DISTINCT language FROM countrylanguage ORDER BY percent DESC;错误:对于 SELECT DISTINCT,ORDER BY 表达式必须出现在选择列表第 1 行:...T DISTINCT language FROM countrylanguage ORDER BY percent...

标签: sql postgresql sql-order-by


【解决方案1】:

您无需选择要对其进行排序的列。

create table language_pct (
  id integer primary key,
  language varchar(15) not null,
  percentage real not null,
  unique (language)
);

insert into language_pct values
(1, 'English', 15.3),
(2, 'French', 32.108),
(3, 'Russian', 12.88);

select language
from language_pct
order by percentage desc;

French
English
Russian

如果你有两行英文,每行都有不同的百分比,你会让 dbms 为select distinct...做什么?

【讨论】:

  • 好吧,那行得通,我看错了我的表格,因为我的表格中有多种语言对应于不同的国家或地区,所以这就是为什么我把 DISTINCT 放在那里但我忘记了不同的地区可能包含相同的语言。谢谢
【解决方案2】:

如果您对每种语言有多个条目,希望结果中每种语言只有一行,并且仍希望按百分比排序,您可能需要GROUP BY language 并将百分比与sum()(或另一个@987654321 @,取决于你的实际数据):

SELECT language, sum(percentage) AS total_percentage
FROM   countrylanguage
GROUP  BY language
ORDER  BY total_percentage DESC;

如果您只希望每种语言一个条目具有最大百分比,您可以使用DISTINCT ON,但要区分的列ORDER BY 子句中排在第一位:

SELECT DISTINCT ON (language)
       language, percentage
FROM   countrylanguage
ORDER  BY language, percentage DESC;

关于DISTINCT ON

现在要按语言排序,您必须将其放入子查询中:

SELECT * FROM (
   <query from above>
   ) AS sub
ORDER  BY percentage DESC, language; -- language only serves as tiebreaker

或者使用 GROUP BY 的不同路由:

SELECT language, max(percentage) AS max_percentage
FROM   countrylanguage
GROUP  BY language
ORDER  BY max_percentage DESC;

或者将DISTINCTwindow functions结合起来:

SELECT * FROM (
   SELECT DISTINCT
          language, max(percentage) OVER (PARTITION BY language) AS max_percent
   FROM   countrylanguage
   ) AS sub
ORDER  BY max_percent DESC;

在这种情况下,最后一个将是最慢的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-18
    • 2010-11-27
    • 1970-01-01
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    • 2012-07-10
    • 2014-11-13
    相关资源
    最近更新 更多