簡體   English   中英

SQL - 選擇最常見的值

[英]SQL - select most frequent value

我堅持這個,我希望有人可以幫我這個:

SELECT max(SELECT count(TO_CHAR(hire_date, 'DAY')) 
           FROM employees 
           GROUP BY TO_CHAR(hire_date, 'DAY')) 
FROM employees;

           *
ERROR at line 1:
ORA-00936: missing expression

子查詢的輸出如下所示:

TO_CHAR(HIRE_DATE,'DAY')         COUNT(TO_CHAR(HIRE_DATE,'DAY'))
---------------------------------------- -------------------------------
THURSDAY                                   3
SATURDAY                                   3
WEDNESDAY                                  4
MONDAY                                     1
SUNDAY                                     3
TUESDAY                                    6

我只想選擇星期二

您可以通過將分析函數RANK()到內部查詢的SELECT子句來完成此操作。 然后在外部查詢中選擇排名為1的行。這將產生所有“並列第一天”(單個獲勝者或並列第一名)。

https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions123.htm (尋找解析版!)

to_char(....)看起來很難看,但由於它是確定性的,因此Oracle只計算一次(即使它在四個地方使用)。

select dy, ct
from   (
         select   to_char(hire_date, 'DAY') as dy,
                  count(to_char(hire_date, 'DAY')) as ct,
                  rank() over (order by count(to_char(hire_date, 'DAY')) desc) as rk
         from     hr.employees
         group by to_char(hire_date, 'DAY')
       )
where  rk = 1
;

問題中的子查詢不會產生描述的輸出。 嘗試使用子查詢。

select max( total ) from (
    SELECT TO_CHAR(HIRE_DATE,'DAY') day 
    , count(TO_CHAR(hire_date, 'DAY')) total
    FROM employees 
    GROUP BY TO_CHAR(hire_date, 'DAY')
) daysTotals

在oracle上未經測試。

您可以使用HAVING -clause中的子查詢來解決此問題:

select TO_CHAR(hire_date, 'DAY') as day, count(TO_CHAR(hire_date, 'DAY')) as cnt
FROM employees 
GROUP BY TO_CHAR(hire_date, 'DAY')) 
HAVING count(TO_CHAR(hire_date, 'DAY')) >= ALL (
           SELECT count(TO_CHAR(hire_date, 'DAY')) 
           FROM employees 
           GROUP BY TO_CHAR(hire_date, 'DAY')

試試這個..這個想法是使用內部內部聯接來獲得最多招聘人數的所有日子。

select hiredays.* from (
    select max( total ) total from (
        SELECT TO_CHAR(HIRE_DATE,'DAY') day 
        , count(TO_CHAR(hire_date, 'DAY')) total
        FROM employees 
        GROUP BY TO_CHAR(hire_date, 'DAY')) 
    ) daysTotals
) maximum
inner join (
    SELECT TO_CHAR(HIRE_DATE,'DAY') day 
    , count(TO_CHAR(hire_date, 'DAY')) total
    FROM employees 
    GROUP BY TO_CHAR(hire_date, 'DAY'))
) hiredays
on hiredays.total = maximum.total

在Oracle上未經測試。

使用子查詢查找一周中唯一的招聘日期和相關的計數。 然后,使用RANK函數確定哪一個是頂部。 然后,選擇具有最高排名的那一天。

WITH HireSummary AS (
     SELECT TO_CHAR(hire_date, 'DAY') AS HireDay, 
            COUNT(TO_CHAR(hire_date, 'DAY')) AS HireDayCount 
     FROM employees 
     GROUP BY TO_CHAR(hire_date, 'DAY')),
RankedSummary AS (
     SELECT HireDay, HireDayCount, RANK() OVER (ORDER BY HireDayCount DESC) AS DayRank
     FROM HireSummary)
SELECT HireDay FROM RankedSummary WHERE DayRank = 1;

這樣做的好處是,如果你在周二和周三都雇用了6個人,那么它將同時返回。

但是,如果您只想要上述案例的單一答案,請將SELECT HireDay轉換為SELECT MAX(HireDay)

使用FIRST表達式時,即使沒有子查詢,也可以執行此操作:

SELECT 
    MAX(COUNT(hire_date)) KEEP (DENSE_RANK LAST ORDER BY COUNT(hire_date)),
    MAX(TO_CHAR(hire_date, 'DAY')) KEEP (DENSE_RANK LAST ORDER BY COUNT(hire_date))
FROM EMPLOYEES
GROUP BY TO_CHAR(hire_date, 'DAY');

但請注意,這只返回一天。 如果您有幾天與相同數量的員工,您將只看到其中一個。

您的查詢沒有意義,但您描述了您想要的內容,並且已經有答案可以回答這個問題。 我想你想做點什么

SELECT max(empcount)
from (SELECT count(TO_CHAR(hire_date, 'DAY'))  empcount
    FROM employees 
    GROUP BY TO_CHAR(hire_date, 'DAY')) 
;

哪會回來

6

我不會嘗試在此處編寫適當的select語句,而是專注於錯誤消息。

您在選擇列表中使用select語句。 這稱為標量子查詢表達式。 數據庫SQL語言參考,子節:標量子查詢表達式說:

您可以在調用表達式(expr)的大多數語法中使用標量子查詢表達式。 在所有情況下,標量子查詢必須括在其自己的括號中,即使其語法位置已將其置於括號內(例如,當標量子查詢用作內置函數的參數時)。

所以錯誤信息

ORA-00936: missing expression

是正確的。 max(之后max(解析器期望一個表達式而不是關鍵字select。所以你必須添加一對額外的括號:一個用於max函數,一個用於select語句:但現在他聲明

SELECT max((SELECT count(TO_CHAR(hire_date, 'DAY')) 
    FROM employees 
    GROUP BY TO_CHAR(hire_date, 'DAY')))
    FROM employees;

加薪

ORA-01427: single-row subquery returns more than one row

正如預期的那樣,因為您的subselect返回多行。

(Oracle Database 12c企業版12.2.0.1.0版 - 64位)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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