簡體   English   中英

每天計數(mysql)

[英]count of every day (mysql)

我想要這樣的東西

MySQL數據

(dat_reg)
1.1.2000 
1.1.2000 
1.1.2000
2.1.2000
2.1.2000
3.1.2000

我想得到:

   (dat_reg)  (count)
    1.1.2000 -   3
    2.1.2000 -   5
    3.1.2000 -   6

我試過的是:

SELECT COUNT( * ) as a , DATE_FORMAT( dat_reg, '%d.%m.%Y' ) AS dat 
FROM members 
WHERE (dat_reg > DATE_SUB(NOW() , INTERVAL 5 DAY)) 
GROUP BY DATE_FORMAT(dat_reg, '%d.%m.%Y') 
ORDER BY dat_reg 

但我得到:

 1.1.2000 - 3 | 2.1.2000 - 2 | 3.1.2000 - 1 

一些技巧,如何為此創建查詢?

子查詢計算注冊日期小於或等於當前注冊日期的行可以幫助您。

SELECT m2.dat_reg,
       (SELECT count(*)
               FROM members m3
               WHERE m3.dat_reg <= m2.dat_reg) count
       FROM (SELECT DISTINCT m1.dat_reg
                    FROM m1.members
                    WHERE m1.dat_reg > date_sub(now(), INTERVAL 5 DAY)) m2
       ORDER BY m2.dat_reg;

(如果您有幾天沒有人登記並且不想在結果中留下空白,則需要用表或子查詢替換別名為m2子查詢,該表或子查詢的所有天都在相應范圍內。)

我建議在MySQL中使用變量:

SELECT d.*, (@sumc := @sumc + cnt) as running_cnt
FROM (SELECT DATE_FORMAT(dat_reg, '%d.%m.%Y') as dat, COUNT(*) as cnt
      FROM members 
      WHERE dat_reg > DATE_SUB(NOW() , INTERVAL 5 DAY) 
      GROUP BY dat
      ORDER BY dat_reg 
     ) d CROSS JOIN
     (SELECT @sumc := 0) params;

如果要從一開始就進行累加,則需要一個附加的子查詢:

SELECT d.*
FROM (SELECT d.*, (@sumc := @sumc + cnt) as running_cnt
      FROM (SELECT DATE_FORMAT(dat_reg, '%d.%m.%Y') as dat, dat_reg, COUNT(*) as cnt
            FROM members 
            GROUP BY dat
            ORDER BY dat_reg 
           ) d CROSS JOIN
           (SELECT @sumc := 0) params
      ) d
WHERE dat_reg > DATE_SUB(NOW() , INTERVAL 5 DAY)

我相信您可以使用window函數來完成工作:

mysql> SELECT employee, sale, date, SUM(sale) OVER (PARTITION by employee ORDER BY date) AS cum_sales FROM sales;
+----------+------+------------+-----------+
| employee | sale | date       | cum_sales |
+----------+------+------------+-----------+
| odin     |  200 | 2017-03-01 |       200 |
| odin     |  300 | 2017-04-01 |       500 |
| odin     |  400 | 2017-05-01 |       900 |
| thor     |  400 | 2017-03-01 |       400 |
| thor     |  300 | 2017-04-01 |       700 |
| thor     |  500 | 2017-05-01 |      1200 |
+----------+------+------------+-----------+

就您而言,您已經具有正確的組,這僅是指定要匯總數據的順序的問題。

資料來源: https : //mysqlserverteam.com/mysql-8-0-2-introducing-window-functions/

干杯

這是使用等級和連續計數變量的解決方案:

WITH ranked AS (
  SELECT m.* 
    ,ROW_NUMBER() OVER (PARTITION BY m.dat_reg ORDER BY m.id DESC) AS rn
  FROM (
    select id, dat_reg
    ,@cnt := @cnt + 1 AS ccount from members
    ,(SELECT @cnt := 0) var 
   WHERE (dat_reg > DATE_SUB(NOW(), INTERVAL 5 DAY))
  ) AS m
)
SELECT DATE_FORMAT(dat_reg, '%d.%m.%Y') as dat, ccount FROM ranked WHERE rn = 1;

DB提琴

暫無
暫無

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

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