簡體   English   中英

選擇特定列的值相似的行,每個月出現n次

[英]Selecting rows which have a similar value for a particular column which occurs n times each month

我有一個包含多列的數據庫,從中創建了該視圖,其中有多行類似於下面所示。 該數據適用於從2009年到2010年的每個月的每一天以及給定5個名字的所有月份。 我必須獲得每月出現5次以上“超級”類別的“名稱”,並分別列出每個月的名稱。 該視圖包含所有月份的數據。

Name  Dates      Category
--------------------------------
PAT  2009-01-01 Super
YAT  2009-01-01 No 
ROT  2009-01-01 No 
SUP  2009-01-01 Super 
ANT  2009-01-01 Super 

我嘗試使用以下方法獲取MySQL中的名稱計數

SELECT `NAME`,`DATES` 
FROM (
        SELECT `NAME`, `CATEGORY`,MONTH(`DATES`)
        FROM VIEW
        GROUP BY `NAME`, `CATEGORY`,MONTH(`DATES`)
        HAVING COUNT(`CATEGORY`)>5 
    ) a
GROUP BY `NAME`
HAVING count(`CATEGORY`)>5;

但是它不返回任何行。

您正在嘗試將行分組為幾個月。 最好的方法是從一個表達式開始,該表達式可以使用任何日期並將其轉換為發生該日期的月份的第一天。 那個表情是。

 DATE(DATE_FORMAT(dates, '%Y-%m-01'))

接下來,在帶有GROUP BY子句的查詢中使用此表達式。

SELECT NAME, CATEGORY, 
       DATE(DATE_FORMAT(DATES, '%Y-%m-01')) DATES
  FROM VIEW
 GROUP BY NAME, CATEGORY, DATE(DATE_FORMAT(DATES, '%Y-%m-01'))
HAVING COUNT(*) > 5

這將產生出現超過五次的所有名稱/類別/月份組合。

我想這就是你想要的。 但是,也許您想讓“超級”類別出現在某個名稱中的次數超過五次的任何月份中列出的所有每月項目。 為此,我們編寫一個子查詢以獲取這些日期的列表:

            SELECT DATE(DATE_FORMAT(DATES, '%Y-%m-01')) DATES
              FROM VIEW
             WHERE CATEGORY = 'Super'
             GROUP BY NAME, DATE(DATE_FORMAT(DATES, '%Y-%m-01'))
            HAVING COUNT(*) > 5

然后我們編寫一個主查詢以獲取所有數據

SELECT DISTINCT
       NAME, CATEGORY, 
       DATE(DATE_FORMAT(DATES, '%Y-%m-01')) DATES
  FROM VIEW
 WHERE DATE(DATE_FORMAT(DATES, '%Y-%m-01')) IN
        (
            SELECT DATE(DATE_FORMAT(DATES, '%Y-%m-01')) DATES
              FROM VIEW
             WHERE CATEGORY = 'Super'
             GROUP BY NAME, DATE(DATE_FORMAT(DATES, '%Y-%m-01'))
            HAVING COUNT(*) > 5
        )

使這種事情起作用的技巧是選擇在GROUP BY子句中使用的正確的日期-算術表達式。 令人驚訝的是,像DAY()MONTH()YEAR()類的功能很難正確使用,因此我認為您可能會發現DATE(DATE_FORMAT(dates, '%Y-%m-01'))更可靠。

暫無
暫無

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

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