首页 > 解决方案 > 如何按某些列和 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 的重复行,并在最后得到“印象数”列的总和。

那么我可以使用什么查询来实现这种结果呢?

标签: sqlmariadb

解决方案


您似乎正在寻找一个在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          |

推荐阅读