从累积和表中获取数据

时间:2020-04-22 20:11:21

标签: mysql optimization cumulative-sum

这是我的主表,用于根据日期存储关键字印象。

+---------+-----------+------------+-------------+
| ID      | KeywordId | ReportDate | Impressions |
+---------+-----------+------------+-------------+
| 3324620 | 969274443 | 2018-12-21 | 1           |
+---------+-----------+------------+-------------+
| 3334253 | 969274443 | 2018-12-22 | 0           |
+---------+-----------+------------+-------------+
| 3354119 | 969274443 | 2018-12-23 | 20          |
+---------+-----------+------------+-------------+
| 3373097 | 969274443 | 2018-12-24 | 11          |
+---------+-----------+------------+-------------+
| 3392168 | 969274443 | 2018-12-25 | 1           |
+---------+-----------+------------+-------------+

这是我的累计总和表,每天都会累计展示次数

+----+-----------+------------+-------------+
| ID | keywordId | ReportDate | Impressions |
+----+-----------+------------+-------------+
| 1  | 969274443 | 2018-12-21 | 1           |
+----+-----------+------------+-------------+
| 2  | 969274443 | 2018-12-22 | 1           |
+----+-----------+------------+-------------+
| 3  | 969274443 | 2018-12-23 | 21          |
+----+-----------+------------+-------------+
| 4  | 969274443 | 2018-12-24 | 32          |
+----+-----------+------------+-------------+
| 5  | 969274443 | 2018-12-25 | 33          |
+----+-----------+------------+-------------+

要获取日期2018-12-21和2018-12-25之间的展示次数,只需减去

33-1并得到结果22。

我使用以下查询来获得此结果。

select  keyword.keywordId,(second.impressions - first.impressions) as imp from keyword
inner join diffreportkeyword as first on first.keywordId = keyword.keywordId
                                     and first.reportDate = '2018-12-21'
inner join diffreportkeyword as second on second.keywordId = keyword.keywordId
                                      and second.reportDate = '2018-12-25'

但是有时没有特定日期的数据,查询返回0行。但这意味着在特定日期印象数为0。

如果我通过左连接更改此内容,

select  keyword.keywordId,(second.impressions - first.impressions) as imp from keyword
left join diffreportkeyword as first on first.keywordId = keyword.keywordId
                                     and first.reportDate = '2018-12-18'
left join diffreportkeyword as second on second.keywordId = keyword.keywordId
                                      and second.reportDate = '2018-12-25'

这可行,但是diffreportkeyword表具有500万行,而关键字表具有300k个不同的“ keywordId”,并且左联接使查询非常慢。

我的问题是

如何使其更快?

谢谢

1 个答案:

答案 0 :(得分:0)

userDetails
  .where({ user_id: user.attributes.id })
  .orderBy('created_at', 'DESC') // Last created first
  .fetch({ require: false })
  .then(res => console.log(res.toJSON()))

需要

  on second.keywordId = keyword.keywordId
 and second.reportDate = '2018-12-25'

旁注:说起来可能更简单

INDEX(keywordId, reportDate)  -- in either order

代替

    '2018-12-21' - INTERVAL 3 DAY
相关问题