sql - 如何按某些列和 SQL 中的每个日期选择唯一行?
问题描述
我有一个如下所示的数据库表:
id | project_id | stat_date | source | medium | campaign | impressions
----------------------------------------------------------------------
5 | 2312 | 2019-08-30| google | cpc | camp_a | 20
4 | 2312 | 2019-08-30| google | cpc | camp_a | 20
3 | 2312 | 2019-08-30| google | organic| camp_b | 12
2 | 2312 | 2019-08-29| google | cpc | camp_a | 35
1 | 2312 | 2019-08-29| google | cpc | camp_c | 44
...| ... | ...| ... | ... | ... | ...
我需要得到的是(没有 id、stat_date 列)在 29 日和 30 日之间(日期间隔可能会有所不同):
project_id | source | medium | campaign | impressions
------------------------------------------------------
2312 | google | cpc | camp_a | 55
2312 | google | organic| camp_b | 12
2312 | google | cpc | camp_c | 44
如您所见,我想删除印象数为 20 的重复行,并在最后得到“印象数”列的总和。
那么我可以使用什么查询来实现这种结果呢?
解决方案
您似乎正在寻找一个在WHERE
子句中带有过滤器的简单聚合查询:
SELECT
project_id,
source,
medium,
campaign,
SUM(DISTINCT impressions) impressions
FROM mytable
WHERE stat_date >= '2019-08-29' AND stat_date <= '2019-08-30'
GROUP BY
project_id,
source,
medium,
campaign
但是,应该注意的是,上面的查询假设相同的impressions
计数不会在两个不同的日子出现project_id/source/medium/campaign
。虽然这适用于您的示例数据,但它可能不是您所需要的。
以下查询可能会为您提供该边缘情况的更好结果(它实际上在聚合之前删除了重复项):
SELECT
project_id,
source,
medium,
campaign,
SUM(impressions) impressions
FROM (
SELECT DISTINCT
stat_date,
project_id,
source,
medium,
campaign,
impressions
FROM mytable
) x
WHERE stat_date >= '2019-08-29' AND stat_date <= '2019-08-30'
GROUP BY
project_id,
source,
medium,
campaign
在这个关于 DB Fiddle 的演示中,两个查询都返回:
| project_id | source | medium | campaign | impressions |
| ---------- | ------ | ------- | -------- | ----------- |
| 2312 | google | cpc | camp_a | 55 |
| 2312 | google | cpc | camp_c | 44 |
| 2312 | google | organic | camp_b | 12 |
推荐阅读
- php - 需要有关如何使用 PHP 读取由 Google 自定义 REST API 返回的 JSON 对象的指导
- json - 如何从 Spring Rest Controller 中的序列化 JSON 返回 JSON
- linux - 使用 bazel 为 ARM64 交叉编译 C++ 项目
- python-3.x - Python PCAP 中的函数
- r - 无法在 RStudio 中安装 tsDyn 包,“mnormt”不存在
- php - 自定义 Flash 消息 PHP
- firebase - 如何从来自 2 个不同项目的 2 个不同 Firebase 数据库中读取数据
- html - 来自 api 调用的 Angular 9 数据未填充下拉列表
- android - Firebase Crashlytics 无法在 Firebase 控制台中报告崩溃
- reactjs - React, dynamically change part of a route