我覺得這個問題以前被問過,我找不到確切的要求或資料庫引擎(PostgreSQL),所以請隨時將我鏈接到原文。
我有一個看似簡單的要求:給定一個orders表,我需要找到12個月范圍內的訂單,但結束日期將是表中找到的最大日期。所關注的列被稱為order_date,并以YYYY-mm-dd格式存盤日期。
所以,這里是我的嘗試,但它失敗了,說別名的列(max_order_date)不存在:
SELECT * FROM orders WHERE order_date BETWEEN
(SELECT max(order_date) FROM orders as max_order_date)
AND (SELECT max_order_date - INTERVAL '1 year')。
在看到Postgres的抱怨后,我試著寫了一個沒有別名的查詢:
SELECT * FROM orders WHERE order_date BETWEEN
(SELECT max(order_date) FROM訂單 as max_order_date)
AND (SELECT max(order_date)- INTERVAL '1 year')。)
只有這一次,我得到了這個錯誤。在WHERE子句中不允許使用聚合函式。
顯然,我正在尋找進行這一查詢的正確方法,但也非常渴望了解為什么存在上述兩個限制。也就是說,為什么在第一種情況下別名不能作業,以及為什么在WHERE中不允許聚合?對我來說,這并不像我在要求什么扭曲的或不可能計算的東西。
謝謝你!
uj5u.com熱心網友回復:
你可以使用max()over()的分析函式來確定最大訂單日期,然后使用過濾器來檢查訂單日期是否位于1年和最大訂單日期之間。
select *
from (SELECT o.*)
,max(order_date) over(partition by 1) as max_order_date
FROM orders o
)x
where order_date>= x.max_order_date - INTERVAL '1 year'
uj5u.com熱心網友回復:
這可能是更有效的使用子查詢:
select o.*
from orders o.
where o. order_date > = (select max(order_date) - interval '1 year' from orders)。)
子查詢和外層查詢都可以使用orders(order_date)的索引。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/307975.html
標籤:
上一篇:Pgadmin4-審查已定義的域
