[英]How to group by date and sort in Oracle?
我運行這個 SQL 請求:
SELECT Max(scaleA.val) AS scaleA_val,
Max(scaleB.val) AS scaleB_val,
To_char(From_dt1970(scaleA.time1970), 'DD') AS day
FROM rsdu2elarh.el008_6305119 scaleA
FULL OUTER JOIN rsdu2elarh.el008_6305126 scaleB
ON scaleA.time1970 = scaleB.time1970
WHERE scaleA.time1970 > To_dt1970(To_date('2019/11/01', 'yyyy/mm/dd'))
AND scaleA.time1970 < To_dt1970(To_date('2019/12/01', 'yyyy/mm/dd'))
GROUP BY 'day'
ORDER BY 'day'
並返回:
但它不是按日期排序的。 如何讓請求顯示按日期排序的數據? 我所有的嘗試都導致“不是按表達式分組”或許多重復的字段:(
如果使用 GROUP BY 子句,則 SELECT 或 ORDER BY 中的任何表達式,它不是組函數(或聚合函數或聚合列),如 COUNT、AVG、MIN、MAX、SUM 等(聚合函數列表)應為存在於 GROUP BY 子句中。
例1:(這里employee_id不是分組函數,所以必須出現在GROUP BY中。相比之下,sum(salary)是分組函數(聚合列),所以不需要出現在GROUP BY子句中。
SELECT employee_id, sum(salary)
FROM employees
GROUP BY employee_id
ORDER BY employee_id;
示例 2:這將導致“not a group by expression”錯誤。
SELECT employee_id, sum(salary)
FROM employees;
要更正,您需要執行以下操作之一:
將 SELECT 和 ORDER BY 子句中列出的所有非聚合表達式包含在 GROUP BY 子句中。
您不能使用未分組的列進行排序,因為相同的日期可能出現在多個組中,因此如果您想按DD
排序,則可以在order by
子句中使用它,如下所示:
SELECT MAX(scaleA.VAL) AS scaleA_val, MAX(scaleB.VAL) AS scaleB_val FROM RSDU2ELARH.EL008_6305119 scaleA
FULL OUTER JOIN RSDU2ELARH.EL008_6305126 scaleB ON scaleA.time1970 = scaleB.time1970
WHERE scaleA.time1970 > TO_DT1970(TO_DATE ('2019/11/01', 'yyyy/mm/dd')) AND scaleA.time1970 < TO_DT1970(TO_DATE ('2019/12/01', 'yyyy/mm/dd'))
GROUP BY TO_CHAR(FROM_DT1970(scaleA.time1970), 'DD')
-- use this order by clause
Order by TO_CHAR(FROM_DT1970(scaleA.time1970), 'DD')
干杯!!
您可以嘗試將TO_CHAR(FROM_DT1970(scaleA.time1970), 'DD')
也添加到 SELECT 列表中,將其別名並在 ORDER BY Clause 中使用:
SELECT TO_CHAR(FROM_DT1970(scaleA.time1970), 'DD') AS myDay,
MAX(scaleA.VAL) AS scaleA_val,
MAX(scaleB.VAL) AS scaleB_val
FROM RSDU2ELARH.EL008_6305119 scaleA
FULL OUTER JOIN RSDU2ELARH.EL008_6305126 scaleB
ON scaleA.time1970 = scaleB.time1970
WHERE scaleA.time1970 > TO_DT1970(DATE'2019-11-01')
AND scaleA.time1970 < TO_DT1970(DATE'2019-12-01')
GROUP BY TO_CHAR(FROM_DT1970(scaleA.time1970), 'DD')
ORDER BY myDay
而列別名不能用於 GROUP BY 子句。
您的查詢中唯一缺少的是我們不能在 group by 子句中使用別名,但是可以在 order by 子句中使用別名,因此下面的查詢將起作用。
SELECT Max(scaleA.val) AS scaleA_val,
Max(scaleB.val) AS scaleB_val,
To_char(From_dt1970(scaleA.time1970), 'DD') AS day
FROM rsdu2elarh.el008_6305119 scaleA
FULL OUTER JOIN rsdu2elarh.el008_6305126 scaleB
ON scaleA.time1970 = scaleB.time1970
WHERE scaleA.time1970 > To_dt1970(To_date('2019/11/01', 'yyyy/mm/dd'))
AND scaleA.time1970 < To_dt1970(To_date('2019/12/01', 'yyyy/mm/dd'))
GROUP BY To_char(From_dt1970(scaleA.time1970), 'DD')
ORDER BY day;
如果要使用別名,則需要使用子查詢
SELECT Max(scaleA_val) AS scaleA_val,
Max(scaleB_val) AS scaleB_val,
day from
(select scaleA.val scaleA_val,
scaleB.val AS scaleB_val,
To_char(From_dt1970(scaleA.time1970), 'DD') AS day
FROM rsdu2elarh.el008_6305119 scaleA
FULL OUTER JOIN rsdu2elarh.el008_6305126 scaleB
ON scaleA.time1970 = scaleB.time1970
WHERE scaleA.time1970 > To_dt1970(To_date('2019/11/01', 'yyyy/mm/dd'))
AND scaleA.time1970 < To_dt1970(To_date('2019/12/01', 'yyyy/mm/dd'))
)
GROUP BY day
ORDER BY day;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.