当前位置: 首页 > 面试题库 >

PostgreSQL使用不同的ORDER BY打开

严阳成
2023-03-14
问题内容

我要运行此查询:

SELECT DISTINCT ON (address_id) purchases.address_id, purchases.*
FROM purchases
WHERE purchases.product_id = 1
ORDER BY purchases.purchased_at DESC

但是我得到这个错误:

PG ::错误:错误:SELECT DISTINCT ON表达式必须匹配初始ORDER BY表达式

添加address_id为第一个ORDER BY表达式可使错误静音,但我真的不想添加sorting over
address_id。是否可以不按顺序进行address_id


问题答案:

文档说:

DISTINCT ON(expression [,…])仅保留给定表达式求值相等的每组行的第一行。[…]注意,除非使用ORDER
BY来确保所需的行首先出现,否则每个集合的“第一行”都是不可预测的。[…] DISTINCT ON表达式必须与最左边的ORDER BY表达式匹配。

官方文件

因此,您必须将“”添加address_id到订单依据。

另外,如果您要查找包含每个产品最近购买的产品address_id并按结果排序的整行,purchased_at那么您正在尝试解决最大的每组N个问题,可以通过以下方法解决:

适用于大多数DBMS的常规解决方案:

SELECT t1.* FROM purchases t1
JOIN (
    SELECT address_id, max(purchased_at) max_purchased_at
    FROM purchases
    WHERE product_id = 1
    GROUP BY address_id
) t2
ON t1.address_id = t2.address_id AND t1.purchased_at = t2.max_purchased_at
ORDER BY t1.purchased_at DESC

基于@hkf的答案的更面向PostgreSQL的解决方案:

SELECT * FROM (
  SELECT DISTINCT ON (address_id) *
  FROM purchases 
  WHERE product_id = 1
  ORDER BY address_id, purchased_at DESC
) t
ORDER BY purchased_at DESC


 类似资料:
  • 问题内容: 最终,我想为PostgreSql中的数据提供一个可扩展的搜索解决方案。我的发现指向我使用Logstash将写入事件从Postgres传送到ElasticSearch,但是我没有找到可用的解决方案。我发现的解决方案涉及使用jdbc- input 间隔查询Postgres的 所有 数据,并且不捕获删除事件。 我认为这是一个常见的用例,因此我希望你们可以与我分享您的经验,或者给我一些指导。

  • 我尝试使用多个自定义字段显示结果,同时按第一个自定义字段(startdate)排序结果。我看到的建议让我尝试了以下方法: 问题是,如果没有meta_key参数,结果会默认过滤帖子的日期。当我添加meta_key参数对结果进行排序时,我得到的每一篇文章都有一个meta_key等于开始日期。通过添加这些meta_key参数,语句似乎完全忽略了meta_query数组中的条件。我如何让查询排序的开始日期

  • 问题内容: 我正在尝试将AngularJS用于我的第一个项目(锦标赛经理),并且筛选器不起作用:(我已阅读了有关该文档的所有文档,但无济于事:/ 所以,我在上面定义了vars : 现在,在我看来,我正在尝试重新排序(首先只有一个订单项),但是再也无法工作… 第二次,我要重新排序,从2条信息:和如果第一是平等的。我尝试更换这样的,但如果一个代码没有工作,他绝不会与2工作… 谢谢大家的阅读,对于帖子的

  • 问题内容: 我想更改网页上的某些内容。我也想隐藏一些东西。打印时,有没有办法用CSS做到这一点?我尤其希望能够隐藏一些DIV及其包含的所有DIV。 问题答案: 可以使用单独的打印样式表来实现。该属性是关键:

  • 我有一个代码是这样的: } 有人知道为什么查询不能使用Order By time_end ASC吗???我尝试了并得到了相同的结果

  • 我注意到Chrome中的orderBy排序与其他浏览器中的排序不同。 我正在为角1.3中的一个项目写作。 对于特定的浏览器没有特殊的逻辑,两个数组完全相同。 谓词是显式定义的: 我的ng重复看起来像这样: 我的代码没有什么特别之处。但是,“大小”是字符串(例如大小:“8-”、…、大小:“6”、…)。为什么Chrome上的排序方式与其他浏览器完全不同? 我所有的结果都是从后端按样式分组排序,然后按大