簡體   English   中英

如何在Oracle中按日期分組和排序?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM