You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在统计邮件计数时合并显示对应PROPERTY字段值?

需求:合并同一邮箱的PROPERTY字段并保留计数

我有一张名为list_all的表,结构及数据如下:

|   EMAIL     |    PROPERTY     |   ISP_GROUP    |  LAST_SENT_DATE |
--------------------------------------------------------------------
| email1      |    prop1        |   gmail        |  2024-06-25     |
| email2      |    prop3        |   yahoo        |  2024-06-02     |
| email3      |    prop2        |   other        |  2024-06-15     |
| email1      |    prop5        |   gmail        |  2024-06-16     |
| email1      |    prop6        |   gmail        |  2024-06-22     |
--------------------------------------------------------------------

目前我可以通过以下查询获取指定日期范围内各邮箱的出现次数:

SELECT 
    COUNT(`email`) as 'EMAIL COUNT'
    , `email` 
    , `isp_group`
FROM `list_all` 
WHERE `last_sent_date` BETWEEN '2024-06-01' AND '2024-06-30'
GROUP BY `email`, `isp_group`
ORDER BY `EMAIL COUNT` DESC

查询结果如下:

| EMAIL COUNT    |     email      |   isp_group   |
---------------------------------------------------
|     3          |     email1     |   gmail       |
|     1          |     email2     |   yahoo       |
|     1          |     email3     |   other       |
---------------------------------------------------

我希望在保留邮件计数的同时,将同一邮箱对应的所有PROPERTY合并到一个单元格中,期望得到如下结果:

| EMAIL COUNT    |     email      |   isp_group   |  PROPERTY         |
-----------------------------------------------------------------------
|     3          |     email1     |   gmail       |  prop1,prop5,prop6 |
|     1          |     email2     |   yahoo       |     prop3          |
|     1          |     email3     |   other       |     prop2          |
-----------------------------------------------------------------------

请问能否实现这样的需求?


解决方案

完全可以实现,不同数据库有对应的字符串聚合函数,以下是主流数据库的实现方式:

MySQL/MariaDB

使用GROUP_CONCAT()函数合并PROPERTY字段:

SELECT 
    COUNT(`email`) as 'EMAIL COUNT'
    , `email` 
    , `isp_group`
    , GROUP_CONCAT(`PROPERTY` SEPARATOR ',') as PROPERTY
FROM `list_all` 
WHERE `last_sent_date` BETWEEN '2024-06-01' AND '2024-06-30'
GROUP BY `email`, `isp_group`
ORDER BY `EMAIL COUNT` DESC

若需要对PROPERTY去重,可改用GROUP_CONCAT(DISTINCT PROPERTY SEPARATOR ',')。

PostgreSQL

使用STRING_AGG()函数:

SELECT 
    COUNT(email) as "EMAIL COUNT"
    , email 
    , isp_group
    , STRING_AGG(property, ',') as PROPERTY
FROM list_all 
WHERE last_sent_date BETWEEN '2024-06-01' AND '2024-06-30'
GROUP BY email, isp_group
ORDER BY "EMAIL COUNT" DESC

去重可使用STRING_AGG(DISTINCT property, ',')。

SQL Server(2017及以上版本)

使用STRING_AGG()函数:

SELECT 
    COUNT(email) as [EMAIL COUNT]
    , email 
    , isp_group
    , STRING_AGG(property, ',') as PROPERTY
FROM list_all 
WHERE last_sent_date BETWEEN '2024-06-01' AND '2024-06-30'
GROUP BY email, isp_group
ORDER BY [EMAIL COUNT] DESC

去重需结合子查询实现:

SELECT 
    COUNT(email) as [EMAIL COUNT]
    , email 
    , isp_group
    , STRING_AGG(property, ',') as PROPERTY
FROM (
    SELECT DISTINCT email, isp_group, property
    FROM list_all 
    WHERE last_sent_date BETWEEN '2024-06-01' AND '2024-06-30'
) t
GROUP BY email, isp_group
ORDER BY [EMAIL COUNT] DESC

Oracle

使用LISTAGG()函数:

SELECT 
    COUNT(email) as "EMAIL COUNT"
    , email 
    , isp_group
    , LISTAGG(property, ',') WITHIN GROUP (ORDER BY property) as PROPERTY
FROM list_all 
WHERE last_sent_date BETWEEN DATE '2024-06-01' AND DATE '2024-06-30'
GROUP BY email, isp_group
ORDER BY "EMAIL COUNT" DESC

去重需结合子查询:

SELECT 
    COUNT(email) as "EMAIL COUNT"
    , email 
    , isp_group
    , LISTAGG(property, ',') WITHIN GROUP (ORDER BY property) as PROPERTY
FROM (
    SELECT DISTINCT email, isp_group, property
    FROM list_all 
    WHERE last_sent_date BETWEEN DATE '2024-06-01' AND DATE '2024-06-30'
) t
GROUP BY email, isp_group
ORDER BY "EMAIL COUNT" DESC

内容的提问来源于stack exchange,提问作者John Beasley

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 03:42:27