日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql groupby 日期_sql 语言 groupBy 分组统计时间段解决方案

發布時間:2025/4/16 数据库 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql groupby 日期_sql 语言 groupBy 分组统计时间段解决方案 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

記錄一下數據統計時遇到的問題和解決方案

先貼完整的效果

問題一 GroupBy數據不是每天連續的

統計圖是關于某段時間內,每年/每月/每周的微博數量的折線圖。數據為連續不斷的,但現實的情況中數據庫里的數據不可能是連續的,情況如下

數據中4號 ~ 7號的時間段沒有返回,我們理想中的返回格式是補全沒有的日期,然后在這個日期對應的數量字段填0。

在網上google了一下,解決方案是新建一張自期表做主表,左聯要統計的表,

CREATE TABLE num (i int);-- 創建一個表用來儲存0-9的數字

INSERT INTO num (i) VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9);-- 生成0-9的數字,方便以后計算時間

CREATE TABLE if not exists calendar(datelist date); -- 生成一個存儲日期的表,datalist是字段名

-- 這里是生成并插入日期數據

INSERT INTO calendar(datelist) SELECT

adddate(

( -- 這里的起始日期,你可以換成當前日期

DATE_FORMAT("2016-1-1", '%Y-%m-%d')

),

numlist.id

) AS `date`

FROM

(

SELECT

n1.i + n10.i * 10 + n100.i * 100 + n1000.i * 1000+ n10000.i * 10000 AS id

FROM

num n1

CROSS JOIN num AS n10

CROSS JOIN num AS n100

CROSS JOIN num AS n1000

CROSS JOIN num AS n10000

) AS numlist;

運行sql語句后,請刪除num表

這個時間我們拿到了日期表,用日期表做主表,左聯一下就能解決問題一

問題二 使用了left join,where是針對左表,但左表是日期表,那如何做業務表上的條件限制

原因分析:

數據庫在通過連接兩張或多張表來返回記錄時,都會生成一張中間的臨時表,然后再將這張臨時表返回給用戶;

where條件是在臨時表生成好后,再對臨時表進行過濾的條件;

因此:where 條件加上,已經沒有left join的含義(必須返回左邊表的記錄)了,條件不為真的就全部過濾掉。

解決方案是把限制條件放在on后面

select a.*,b.*

from table1 a

left join table2 b on b.X=a.X and XXX

結論:

where后面:是先連接然生成臨時查詢結果,然后再篩選

on后面:先根據條件過濾篩選,再連 生成臨時查詢結果

結語

水平有限,關于補0的那個問題其實還想到查詢出來用php循環補全日期和補0,但是業務上有很多處要用到這個,用php的話代碼量很多,所以了新建日期表這個方案,如果有好的方案希望大家貼上來,多多交流。

本作品采用《CC 協議》,轉載必須注明作者和本文鏈接

未經允許禁止轉載 -- 苦力小林,

總結

以上是生活随笔為你收集整理的mysql groupby 日期_sql 语言 groupBy 分组统计时间段解决方案的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。