【问题标题】:How do I do a DISTINCT and ORDER BY in PostgreSQL?如何在 PostgreSQL 中执行 DISTINCT 和 ORDER BY?
【发布时间】:2010-12-12 19:57:15
【问题描述】:

PostgreSQL 即将让我打小动物。我正在为 MySQL 执行以下 SQL 语句,以获取唯一的城市/州/国家/地区列表。

SELECT DISTINCT city
              , state
              , country 
           FROM events 
          WHERE (city > '') 
            AND (number_id = 123)  
       ORDER BY occured_at ASC

但是这样做会使 PostgreSQL 抛出这个错误:

PGError: ERROR: for SELECT DISTINCT, ORDER BY 表达式必须出现在选择列表中

但是,如果我将occured_at 添加到 SELECT 中,那么它会扼杀取回唯一列表。

使用 MySQL 和第一次查询的结果:

BEDFORD PARK       IL   US
ADDISON         IL  US
HOUSTON         TX  US

如果我在 SELECT 中添加发生的结果:

BEDFORD PARK       IL   US  2009-11-02 19:10:00
BEDFORD PARK       IL   US  2009-11-02 21:40:00
ADDISON         IL  US  2009-11-02 22:37:00
ADDISON         IL  US  2009-11-03 00:22:00
ADDISON         IL  US  2009-11-03 01:35:00
HOUSTON         TX  US  2009-11-03 01:36:00

第一组结果是我最终尝试使用 PostgreSQL 获得的结果。

【问题讨论】:

    标签: sql mysql database postgresql


    【解决方案1】:

    那么,您希望 Postgres 如何确定在创建排序顺序时使用哪个发生的值?

    我不是特别了解 Postgres 语法,但你可以试试:

    SELECT DISTINCT city, state, country, MAX(occured_at)
           FROM events 
          WHERE (city > '') AND (number_id = 123) ORDER BY MAX(occured_at) ASC
    

    SELECT city, state, country, MAX(occured_at)
           FROM events 
          WHERE (city > '') AND (number_id = 123) 
          GROUP BY city, state, country ORDER BY MAX(occured_at) ASC
    

    假设您想要按最近出现的次数排序的结果。如果要第一次出现,请将 MAX 更改为 MIN。

    顺便说一句,您的标题询问的是 GROUP BY,但您的语法指定了 DISTINCT。

    【讨论】:

    • 拉里,第二个成功了。对标题中的 GROUP BY 感到抱歉……大脑很大程度上来自于尝试大约一百种不同的东西,所以我的思绪在别处。 :)
    • 能够帮助别人总是很高兴。
    猜你喜欢
    • 2019-01-08
    • 1970-01-01
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 2013-10-06
    • 2013-01-25
    • 1970-01-01
    相关资源
    最近更新 更多