bin
发布于

排除在一系列日期列中具有 3 个或更多日期的记录

使用 MySQL 版本 5.7 的 phpMyAdmin。

一个名为 Named 的数据库表,其中包含数百万封具有多个“发送日期”的唯一电子邮件,以及其他列。某些电子邮件的发送日期为 NULL。condensed

只关注这里的 和 列。emailsend_date

以下是该表的示例:

  | email  | a_last_sent | b_last_sent | c_last_sent | d_last_sent | ..up to 14 dates
----------------------------------------------------------------------------------
| email1 | 2024-06-12  | 2024-05-25  |    NULL     | 2024-06-06  |
----------------------------------------------------------------------------------
| email2 | 2024-06-01  | 2024-06-16  |  2024-06-05 | 2024-06-19  |
----------------------------------------------------------------------------------
| email3 |   NULL      |   NULL      |  2024-05-12 | 2024-06-10  |
----------------------------------------------------------------------------------
| email4 |   NULL      | 2024-06-13  |    NULL     | 2024-05-11  |
----------------------------------------------------------------------------------
| email5 | 2024-06-09  | 2024-05-01  |    NULL     |    NULL     |
----------------------------------------------------------------------------------  

需要排除在 6 月份内发送日期超过 3 个的任何内容。

因此,如果电子邮件的发送日期为 3 或列在 6 月份内,请不要返回这些记录。

使用上面的示例,结果应如下所示:

  | email  | a_last_sent | b_last_sent | c_last_sent | d_last_sent | ..up to 14 dates
----------------------------------------------------------------------------------
| email1 | 2024-06-12  | 2024-05-25  |    NULL     | 2024-06-06  |
----------------------------------------------------------------------------------
| email3 |   NULL      |   NULL      |  2024-05-12 | 2024-06-10  |
----------------------------------------------------------------------------------
| email4 |   NULL      | 2024-06-13  |    NULL     | 2024-05-11  |
----------------------------------------------------------------------------------
| email5 | 2024-06-09  | 2024-05-01  |    NULL     |    NULL     |
----------------------------------------------------------------------------------  

上述结果不包括,因为它在 6 月份内有 4 个日期。email2

email1符合条件,因为它在 6 月份只有 2 个日期,在 5 月份只有 1 个日期。

email3、 和 满足条件,因为它们在 6 月内只有 1 个日期,在 5 月只有 1 个日期。email4email5

编写以下查询:

  SELECT 
  * FROM 
`condensed` 
WHERE 
(
  `a_last_sent` NOT BETWEEN '2024-06-01' AND '2024-06-30'
  OR
  `b_last_sent` NOT BETWEEN '2024-06-01' AND '2024-06-30'
  OR
  `c_last_sent` NOT BETWEEN '2024-06-01' AND '2024-06-30' 
  // remaining date columns     
)

上面的查询排除了日期范围内的任何内容。

不确定如何合并计数以排除在指定日期范围(在本例中为 6 月)内超过 3 个日期的任何内容。

浏览 (27)
点赞
收藏
1条评论
Klustron小助手
Klustron小助手
值包含 NULL - 因此我们不能对包含大部分函数/运算符的表达式进行连接或求和。 建议您使用 CONCAT_WS() 连接日期 - 此函数会跳过 NULL。然后计算相应的子字符串的数量。 对于确定的月份,请使用类似 SELECT LENGTH(dateslist) - LENGTH(REPLACE(dateslist, '2024-06-', '2024-06')) AS amount, ... FROM ( SELECT CONCAT_WS(',', a_last_sent, b_last_sent, ..., x_last_sent) AS dateslist, ... ... ) ... 对于自定义范围,请使用 UNION、嵌套 REPLACE(v.5.7 不支持正则表达式 replace)或根据用户定义的函数注册和使用。 当然,您也可以使用多个 COALESCE()。 此外,您可以使用多个 UNION 取消透视数据,然后按常用方式进行计数。
点赞
评论