如何進行內連接和分組數據,同時將最近兩個月的相關條目限制為 1?

伊万話題

我想從一個表中獲取所有 URL 的列表,以及第二個表中每個 URL 的兩個評級。問題是一個評級應該來自當月(如果存在),另一個評級應該來自上個月(如果存在)。這可以用 MySQL 實現嗎?每個 URL 行的兩個評級都應分組到一個單元格中。

數據庫將每月填充一次或多次新值。

表結構和示例數據:

urls 
id | url
1  | google.com
2  | apple.com
3  | bing.com

ratings 
id | rating | url_id | created_at 
1  | 10      | 1      | 2018-10-10
2  | 8       | 2      | 2018-10-10
3  | 11      | 1      | 2018-11-10
4  | 5       | 2      | 2018-11-10
5  | 6       | 3      | 2018-11-25

最後,我的目標是顯示一個簡單的 URL 表並比較它們每個月的評分。

url        | previous rating | current rating
google.com | 10              | 11 (rating has increased)
apple.com  | 8               | 5 (rating has decreased)
bing.com   | -               | 6

這只是一個查詢的開始,我不知道如何限制每個 url 的 2 個評級,如上所述?

SELECT 
    urls.id, 
    urls.url, 
    ratings.rating

FROM urls

INNER JOIN  ratings 
ON urls.id = ratings.url_id
缺口

您可以使用條件聚合來獲得您想要的結果。我假設您希望使用每個月的平均評分進行比較。

SELECT u.url, 
       AVG(CASE WHEN MONTH(r.created_at) = MONTH(CURDATE() - INTERVAL 1 MONTH)
                 AND YEAR(r.created_at)  = YEAR(CURDATE() - INTERVAL 1 MONTH) THEN rating END) AS `previous rating`,
       AVG(CASE WHEN MONTH(r.created_at) = MONTH(CURDATE())
                 AND YEAR(r.created_at) = YEAR(CURDATE()) THEN rating END) AS `current rating`
FROM urls u
LEFT JOIN ratings r
ON r.url_id = u.id
GROUP BY u.url
ORDER BY `current rating` DESC

輸出:

url         previous rating     current rating
google.com  10.0000             11.0000
bing.com                        6.0000
apple.com   8.0000              5.0000

更新

只使用每個月的最後一個評級(如評論中所要求的)有點複雜。可以使用兩個JOINs 來完成包含前幾個月和當前月份的最後評級的表格:

SELECT u.url,
       pr.rating AS `previous rating`,
       cr.rating AS `current rating`
FROM urls u
LEFT JOIN (SELECT url_id, rating
           FROM ratings r1
           WHERE created_at = (SELECT MAX(created_at)
                               FROM ratings r2
                               WHERE r2.url_id = r1.url_id AND
                                   MONTH(created_at) = MONTH(CURDATE() - INTERVAL 1 MONTH) AND
                                   YEAR(created_at)  = YEAR(CURDATE() - INTERVAL 1 MONTH)
                               )
           ) pr ON pr.url_id = u.id
LEFT JOIN (SELECT url_id, rating
           FROM ratings r1
           WHERE created_at = (SELECT MAX(created_at)
                               FROM ratings r2
                               WHERE r2.url_id = r1.url_id
                               )
           ) cr ON cr.url_id = u.id
ORDER BY `current rating` DESC

更新了 dbfiddle 上的演示

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

將 3 個數據框列優先合併為 1 個,同時避免應用

在Python中將兩個json鍵值組合為1個項目

PHP中根據兩個條件對多個關聯數組進行分組和排序

MySQL 內連接限制第二個表中的 1 行

是否有將二維 numpy 數組(坐標數組)拆分為兩個 1-D numpy 數組的有效方法?

如何將鍵上不等長的兩個數據幀組合為連接器?

如何將 Google Sheet 轉換為不同的佈局?將具有相同數據的多行合併為一行,並將唯一數據合併到 1 個單元格中

Google 表單正則表達式 - 將輸入限制為 3 位數字和 1 個不區分大小寫的字母表

按 Id 對行進行分組並將月和 order_count 連接為列?

當其他列中的 5 個連續行為 1 時,如何使標誌列值為 1

如何根據條件創建基於另外兩個 DataFrame 的 0/1 DataFrame?

將 2 個 Pandas 數據幀合併為 1 個多維數據幀

根據python中的條件將列表元素轉換為1和0

如何將 1 個數組中的 2 個數據與不同的值組合在一起?

同時對兩個數組進行排序

Sequelize:如何將存儲在數據庫中的數組中的至少 1 個值與請求中的數組匹配

如何將計數值分組為恰好 1、2 到 5、超過 5 的範圍

我們如何在 C 編程中將 10 數組中最大的 5 個數字替換為 1,最小的 5 替換為 0?

Python:如何重複數據幀中從 1 到 n 的每個行組合?

Laravel 將多個數據保存到 1 列

如何將行聚合為計數並僅顯示 1 行作為答案?

Python:pandas.errors.ParserError:標記數據時出錯。C 錯誤:第 21 行應為 1 個字段,看到 2 個

將 2 個 python 列表轉換為 1 個 Numpy 數組,格式為 ((list1, list2))

在 Google BigQuery 中將 3 個大表連接成 1 個具有 1 對多關係的表

在 Python 中創建一個在特定條件下加起來為 1 的數組

如何將長度為 1 維的 xarray DataArray 與更大的數組對齊?

如何在恆定時間 O(1) 內下溢一個數字?

PYTHON 如何訪問列表/系列/數據幀中第一個和最後一個連續布爾值(或 1 和 0)的索引

為什麼當我使用指針將數組傳遞給函數時,數組的長度顯示為 1?