國(guó)慶期間每類視頻點(diǎn)贊量和轉(zhuǎn)發(fā)量

國(guó)慶期間每類視頻點(diǎn)贊量和轉(zhuǎn)發(fā)量

題目鏈接

描述

用戶-視頻互動(dòng)表tb_user_video_log

id uid video_id start_time end_time if_follow if_like if_retweet comment_id
1 101 2001 2021-09-24 10:00:00 2021-09-24 10:00:20 1 1 0 NULL
2 105 2002 2021-09-25 11:00:00 2021-09-25 11:00:30 0 0 1 NULL
3 102 2002 2021-09-25 11:00:00 2021-09-25 11:00:30 1 1 1 NULL
4 101 2002 2021-09-26 11:00:00 2021-09-26 11:00:30 1 0 1 NULL
5 101 2002 2021-09-27 11:00:00 2021-09-27 11:00:30 1 1 0 NULL
6 102 2002 2021-09-28 11:00:00 2021-09-28 11:00:30 1 0 1 NULL
7 103 2002 2021-09-29 11:00:00 2021-10-02 11:00:30 1 0 1 NULL
8 102 2002 2021-09-30 11:00:00 2021-09-30 11:00:30 1 1 1 NULL
9 101 2001 2021-10-01 10:00:00 2021-10-01 10:00:20 1 1 0 NULL
10 102 2001 2021-10-01 10:00:00 2021-10-01 10:00:15 0 0 1 NULL
11 103 2001 2021-10-01 11:00:50 2021-10-01 11:01:15 1 1 0 1732526
12 106 2002 2021-10-02 10:59:05 2021-10-02 11:00:05 2 0 1 NULL
13 107 2002 2021-10-02 10:59:05 2021-10-02 11:00:05 1 0 1 NULL
14 108 2002 2021-10-02 10:59:05 2021-10-02 11:00:05 1 1 1 NULL
15 109 2002 2021-10-03 10:59:05 2021-10-03 11:00:05 0 1 0 NULL

(uid-用戶ID, video_id-視頻ID, start_time-開始觀看時(shí)間, end_time-結(jié)束觀看時(shí)間, if_follow-是否關(guān)注, if_like-是否點(diǎn)贊, if_retweet-是否轉(zhuǎn)發(fā), comment_id-評(píng)論ID)

短視頻信息表tb_video_info

id video_id author tag duration release_time
1 2001 901 旅游 30 2020-01-01 07:00:00
2 2002 901 旅游 60 2021-01-01 07:00:00
3 2003 902 影視 90 2020-01-01 07:00:00
4 2004 902 美女 90 2020-01-01 08:00:00

(video_id-視頻ID, author-創(chuàng)作者ID, tag-類別標(biāo)簽, duration-視頻時(shí)長(zhǎng), release_time-發(fā)布時(shí)間)

問題:統(tǒng)計(jì)2021年國(guó)慶頭3天每類視頻每天的近一周總點(diǎn)贊量和一周內(nèi)最大單天轉(zhuǎn)發(fā)量,結(jié)果按視頻類別降序、日期升序排序丽惶。假設(shè)數(shù)據(jù)庫(kù)中數(shù)據(jù)足夠多藐鹤,至少每個(gè)類別下國(guó)慶頭3天及之前一周的每天都有播放記錄谴仙。

輸出示例

示例數(shù)據(jù)的輸出結(jié)果如下

tag dt sum_like_cnt_7d max_retweet_cnt_7d
旅游 2021-10-01 5 2
旅游 2021-10-02 5 3
旅游 2021-10-03 6 3

解釋:

由表tb_user_video_log里的數(shù)據(jù)可得只有旅游類視頻的播放屋休,2021年9月25到10月3日每天的點(diǎn)贊量和轉(zhuǎn)發(fā)量如下:

tag dt like_cnt retweet_cnt
旅游 2021-09-25 1 2
旅游 2021-09-26 0 1
旅游 2021-09-27 1 0
旅游 2021-09-28 0 1
旅游 2021-09-29 0 1
旅游 2021-09-30 1 1
旅游 2021-10-01 2 1
旅游 2021-10-02 1 3
旅游 2021-10-03 1 0

因此國(guó)慶頭3天(10.0110.03)里10.01的近7天(9.2510.01)總點(diǎn)贊量為5次雷袋,單天最大轉(zhuǎn)發(fā)量為2次(9月25那天最大)持搜;同理可得10.02和10.03的兩個(gè)指標(biāo)密似。

1. 數(shù)據(jù)準(zhǔn)備

DROP TABLE IF EXISTS tb_user_video_log, tb_video_info;
CREATE TABLE tb_user_video_log (
    id INT PRIMARY KEY AUTO_INCREMENT COMMENT '自增ID',
    uid INT NOT NULL COMMENT '用戶ID',
    video_id INT NOT NULL COMMENT '視頻ID',
    start_time datetime COMMENT '開始觀看時(shí)間',
    end_time datetime COMMENT '結(jié)束觀看時(shí)間',
    if_follow TINYINT COMMENT '是否關(guān)注',
    if_like TINYINT COMMENT '是否點(diǎn)贊',
    if_retweet TINYINT COMMENT '是否轉(zhuǎn)發(fā)',
    comment_id INT COMMENT '評(píng)論ID'
) CHARACTER SET utf8 COLLATE utf8_bin;

CREATE TABLE tb_video_info (
    id INT PRIMARY KEY AUTO_INCREMENT COMMENT '自增ID',
    video_id INT UNIQUE NOT NULL COMMENT '視頻ID',
    author INT NOT NULL COMMENT '創(chuàng)作者ID',
    tag VARCHAR(16) NOT NULL COMMENT '類別標(biāo)簽',
    duration INT NOT NULL COMMENT '視頻時(shí)長(zhǎng)(秒數(shù))',
    release_time datetime NOT NULL COMMENT '發(fā)布時(shí)間'
)CHARACTER SET utf8 COLLATE utf8_bin;

INSERT INTO tb_user_video_log(uid, video_id, start_time, end_time, if_follow, if_like, if_retweet, comment_id) VALUES
   (101, 2001, '2021-09-24 10:00:00', '2021-09-24 10:00:20', 1, 1, 0, null)
  ,(105, 2002, '2021-09-25 11:00:00', '2021-09-25 11:00:30', 0, 0, 1, null)
  ,(102, 2002, '2021-09-25 11:00:00', '2021-09-25 11:00:30', 1, 1, 1, null)
  ,(101, 2002, '2021-09-26 11:00:00', '2021-09-26 11:00:30', 1, 0, 1, null)
  ,(101, 2002, '2021-09-27 11:00:00', '2021-09-27 11:00:30', 1, 1, 0, null)
  ,(102, 2002, '2021-09-28 11:00:00', '2021-09-28 11:00:30', 1, 0, 1, null)
  ,(103, 2002, '2021-09-29 11:00:00', '2021-09-29 11:00:30', 1, 0, 1, null)
  ,(102, 2002, '2021-09-30 11:00:00', '2021-09-30 11:00:30', 1, 1, 1, null)
  ,(101, 2001, '2021-10-01 10:00:00', '2021-10-01 10:00:20', 1, 1, 0, null)
  ,(102, 2001, '2021-10-01 10:00:00', '2021-10-01 10:00:15', 0, 0, 1, null)
  ,(103, 2001, '2021-10-01 11:00:50', '2021-10-01 11:01:15', 1, 1, 0, 1732526)
  ,(106, 2002, '2021-10-02 10:59:05', '2021-10-02 11:00:05', 2, 0, 1, null)
  ,(107, 2002, '2021-10-02 10:59:05', '2021-10-02 11:00:05', 1, 0, 1, null)
  ,(108, 2002, '2021-10-02 10:59:05', '2021-10-02 11:00:05', 1, 1, 1, null)
  ,(109, 2002, '2021-10-03 10:59:05', '2021-10-03 11:00:05', 0, 1, 0, null);

INSERT INTO tb_video_info(video_id, author, tag, duration, release_time) VALUES
   (2001, 901, '旅游', 30, '2020-01-01 7:00:00')
  ,(2002, 901, '旅游', 60, '2021-01-01 7:00:00')
  ,(2003, 902, '影視', 90, '2020-01-01 7:00:00')
  ,(2004, 902, '美女', 90, '2020-01-01 8:00:00');

2.查詢

SELECT * FROM tb_user_video_log; 
SELECT * FROM tb_video_info;
image

image

3.問題

統(tǒng)計(jì)2021年國(guó)慶頭3天每類視頻每天的近一周總點(diǎn)贊量和一周內(nèi)最大單天轉(zhuǎn)發(fā)量
結(jié)果按視頻類別降序葫盼、日期升序排序残腌。假設(shè)數(shù)據(jù)庫(kù)中數(shù)據(jù)足夠多,至少每個(gè)類別下國(guó)慶頭3天及之前一周的每天都有播放記錄贫导。


難點(diǎn):

  • 近一周SQL怎么實(shí)現(xiàn)抛猫?
  • 最大單天轉(zhuǎn)發(fā)量怎么求?if_retweet = 1的多條記錄求和

解析:

  1. 求每類視頻每天的點(diǎn)贊量和每天的轉(zhuǎn)發(fā)量孩灯,時(shí)間是2021-9-25 到 2021-10-3
  2. 使用窗口函數(shù)求 每個(gè)dt日期之前6天(題目中所要求的一周內(nèi))的 日點(diǎn)贊量 的和
  3. 以及單天轉(zhuǎn)發(fā)量的最大值

4. 求解

  1. 先求解求每類視頻每天的點(diǎn)贊量和每天的轉(zhuǎn)發(fā)量闺金,時(shí)間是2021-9-25 到 2021-10-3:
    SELECT
            y.tag,
            DATE(x.start_time)    dt,
            SUM(x.if_like)    AS  daily_like_cnt,
            SUM(x.if_retweet) AS  daily_retweet_cnt
        FROM
            tb_user_video_log x,
            tb_video_info y
        WHERE
            x.video_id = y.video_id
        AND DATE(start_time) BETWEEN "2021-9-25" AND "2021-10-3"
        GROUP BY tag, dt
        ORDER BY tag, dt
image
  1. 求每個(gè)日期每個(gè)日期近一周的點(diǎn)贊量和單天轉(zhuǎn)發(fā)量
WITH t AS (
            SELECT
                y.tag,
                DATE(x.start_time)    dt,
                SUM(x.if_like)    AS  daily_like_cnt,
                SUM(x.if_retweet) AS  daily_retweet_cnt
            FROM
                tb_user_video_log x,
                tb_video_info y
            WHERE
                x.video_id = y.video_id
            AND DATE(start_time) BETWEEN "2021-9-25" AND "2021-10-3"
            GROUP BY tag, dt
            ORDER BY tag, dt
        ) SELECT
            tag,
            dt,
            daily_like_cnt,
            daily_retweet_cnt,
            SUM(daily_like_cnt) over(partition by tag ORDER BY dt rows between 6 preceding AND current row) AS sum_like_cnt_7d,
            max(daily_retweet_cnt) over(partition by tag order by dt rows between 6 preceding and current row) AS max_retweet_cnt_7d
        FROM
            t
image

注意:

SUM(daily_like_cnt) over(partition by tag ORDER BY dt rows between 6 preceding AND current row)
-- 根據(jù)tag分組峰档,dt升序排列败匹,按照行求出當(dāng)前日期對(duì)應(yīng)的daily_like_cnt之前6行的值到當(dāng)前行的值的和,結(jié)果剛好是一周內(nèi)的總點(diǎn)贊量讥巡。

注:窗口函數(shù)的使用

  1. 方法一
聚集函數(shù)/非聚集函數(shù) OVER window_name
WINDOW window_name AS (window_spec)
    

按照第一種方法上面的代碼為:

WITH t AS (
                SELECT
                    y.tag,
                    DATE(x.start_time)    dt,
                    SUM(x.if_like)    AS  daily_like_cnt,
                    SUM(x.if_retweet) AS  daily_retweet_cnt
                FROM
                    tb_user_video_log x,
                    tb_video_info y
                WHERE
                    x.video_id = y.video_id
                AND DATE(start_time) BETWEEN "2021-9-25" AND "2021-10-3"
                GROUP BY tag, dt
                ORDER BY tag, dt
            ) SELECT
                tag,
                dt,
                daily_like_cnt,
                daily_retweet_cnt,
                SUM(daily_like_cnt) over(partition by tag ORDER BY dt rows between 6 preceding AND current row) AS sum_like_cnt_7d,
                max(daily_retweet_cnt) over(partition by tag order by dt rows between 6 preceding and current row) AS max_retweet_cnt_7d
            FROM
                t
  1. 方法二
聚集函數(shù)/非聚集函數(shù) OVER(window_spec)
window_spec : [window_name] [partition_clause] [order_clause] [frame_clause]

按照第二種方法上面的代碼改寫為:

WITH t AS (
                SELECT
                    y.tag,
                    DATE(x.start_time)    dt,
                    SUM(x.if_like)    AS  daily_like_cnt,
                    SUM(x.if_retweet) AS  daily_retweet_cnt
                FROM
                    tb_user_video_log x,
                    tb_video_info y
                WHERE
                    x.video_id = y.video_id
                AND DATE(start_time) BETWEEN "2021-9-25" AND "2021-10-3"
                GROUP BY tag, dt
                ORDER BY tag, dt
            ) SELECT
                tag,
                dt,
                daily_like_cnt,
                daily_retweet_cnt,
                SUM(daily_like_cnt) over w AS sum_like_cnt_7d,
                max(daily_retweet_cnt) over w AS max_retweet_cnt_7d
            FROM t
            WINDOW w  AS (partition by tag ORDER BY dt rows between 6 preceding AND current row);

我們對(duì)著兩種方式進(jìn)行對(duì)比發(fā)現(xiàn):

over(windos_spec), 在 select 后使用多個(gè)窗口函數(shù)時(shí)掀亩, windos_spec 過多,我們使用第二種方法相當(dāng)于把windos_spec重復(fù)的代碼只寫了 一次尚卫,進(jìn)而減少重復(fù)归榕。

  1. 以上我們已經(jīng)得到了所有日期的近一周的點(diǎn)贊量和轉(zhuǎn)發(fā)量,下面只需要 多一條where語(yǔ)句求出指定日期的即可:
SELECT tag, dt, sum_like_cnt_7d, max_retweet_cnt_7d 
FROM (
        上面的with代碼
     ) tt
WHERE dt BETWEEN '2021-10-01' AND '2021-10-03'
order by tag desc, dt asc

全部代碼如下:

SELECT tag, dt, sum_like_cnt_7d, max_retweet_cnt_7d 
FROM (
            WITH t AS (
                SELECT
                    y.tag,
                    DATE(x.start_time)    dt,
                    SUM(x.if_like)    AS  daily_like_cnt,
                    SUM(x.if_retweet) AS  daily_retweet_cnt
                FROM
                    tb_user_video_log x,
                    tb_video_info y
                WHERE
                    x.video_id = y.video_id
                AND DATE(start_time) BETWEEN "2021-9-25" AND "2021-10-3"
                GROUP BY tag, dt
                ORDER BY tag, dt
            ) SELECT
                tag,
                dt,
                daily_like_cnt,
                daily_retweet_cnt,
                SUM(daily_like_cnt) over(partition by tag ORDER BY dt rows between 6 preceding AND current row) AS sum_like_cnt_7d,
                max(daily_retweet_cnt) over(partition by tag order by dt rows between 6 preceding and current row) AS max_retweet_cnt_7d
            FROM
                t) tt
WHERE dt BETWEEN '2021-10-01' AND '2021-10-03'
order by tag desc, dt asc

結(jié)果圖:


image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末吱涉,一起剝皮案震驚了整個(gè)濱河市刹泄,隨后出現(xiàn)的幾起案子外里,更是在濱河造成了極大的恐慌,老刑警劉巖特石,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盅蝗,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡姆蘸,警方通過查閱死者的電腦和手機(jī)墩莫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來逞敷,“玉大人狂秦,你說我怎么就攤上這事⊥凭瑁” “怎么了裂问?”我有些...
    開封第一講書人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)牛柒。 經(jīng)常有香客問我堪簿,道長(zhǎng),這世上最難降的妖魔是什么皮壁? 我笑而不...
    開封第一講書人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任椭更,我火速辦了婚禮,結(jié)果婚禮上蛾魄,老公的妹妹穿的比我還像新娘虑瀑。我一直安慰自己,他們只是感情好畏腕,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開白布缴川。 她就那樣靜靜地躺著,像睡著了一般描馅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上而线,一...
    開封第一講書人閱讀 51,754評(píng)論 1 307
  • 那天铭污,我揣著相機(jī)與錄音,去河邊找鬼膀篮。 笑死嘹狞,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的誓竿。 我是一名探鬼主播磅网,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼筷屡!你這毒婦竟也來了涧偷?” 一聲冷哼從身側(cè)響起簸喂,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎燎潮,沒想到半個(gè)月后喻鳄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡确封,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年除呵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片爪喘。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡颜曾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出秉剑,到底是詐尸還是另有隱情泛啸,我是刑警寧澤吨铸,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布甫窟,位于F島的核電站雹有,受9級(jí)特大地震影響践叠,放射性物質(zhì)發(fā)生泄漏懂更。R本人自食惡果不足惜疼进,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一拍谐、第九天 我趴在偏房一處隱蔽的房頂上張望渔呵。 院中可真熱鬧聚请,春花似錦荠雕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至煤傍,卻和暖如春盖文,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蚯姆。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工五续, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人龄恋。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓疙驾,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親郭毕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子它碎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容