如何提取同一日期下出现的不同LOGCODE数据?
嗨,刚接触MySQL碰到这种问题太正常了,我来给你捋清楚怎么解决!
首先先把你给的示例数据整理成更清晰的表格:
| ORDERID | LOGCODE | EXDATE |
|---|---|---|
| 4970557 | 7462 | 2017-09-06 |
| 4970557 | 7462 | 2017-10-18 |
| 4970557 | 7462 | 2017-11-12 |
| 4970557 | 7462 | 2017-12-14 |
| 4970557 | 5691 | 2018-01-08 |
| 4970557 | 0244 | 2018-01-18 |
| 4970557 | 5691 | 2018-01-26 |
| 4970557 | 7462 | 2018-02-08 |
| 4970557 | 7462 | 2018-02-16 |
| 4970557 | 0026 | 2018-02-22 |
| 4970557 | 4344 | 2018-02-22 |
| 4970557 | 7462 | 2018-02-23 |
| 4970557 | 0026 | 2018-03-23 |
你的需求是:提取同一日期下存在多个不同LOGCODE的所有记录,保留对应的ORDERID、LOGCODE和EXDATE,对吧?之前用GROUP BY的时候可能因为直接把LOGCODE也纳入分组,导致没法保留所有相关记录,这里给你两种实用的解决方案:
方法一:子查询+关联(兼容所有MySQL版本)
先通过子查询筛选出那些有多个不同LOGCODE的日期,再关联原表获取对应的完整记录:
SELECT t.ORDERID, t.LOGCODE, t.EXDATE FROM your_table t INNER JOIN ( -- 找出存在多个不同LOGCODE的日期 SELECT EXDATE FROM your_table GROUP BY EXDATE HAVING COUNT(DISTINCT LOGCODE) > 1 ) AS date_filter ON t.EXDATE = date_filter.EXDATE ORDER BY t.EXDATE, t.LOGCODE;
运行这个语句后,你就能得到示例中2018-02-22的两条记录,其他日期因为只有单一LOGCODE会被自动过滤掉。
方法二:窗口函数(MySQL 8.0及以上版本可用)
如果你的MySQL版本是8.0或更高,用窗口函数会更简洁,不需要关联子查询:
SELECT ORDERID, LOGCODE, EXDATE FROM ( SELECT ORDERID, LOGCODE, EXDATE, -- 计算每条记录所在日期的不同LOGCODE总数 COUNT(DISTINCT LOGCODE) OVER (PARTITION BY EXDATE) AS logcode_count FROM your_table ) AS temp -- 只保留总数大于1的记录 WHERE logcode_count > 1 ORDER BY EXDATE, LOGCODE;
窗口函数PARTITION BY EXDATE会按日期分组统计,给每条记录打上该日期的LOGCODE种类数标记,外层筛选标记大于1的记录即可。
两种方法都能完美满足你的需求,你可以根据自己的MySQL版本选择合适的方式~
内容的提问来源于stack exchange,提问作者D. Walsh
相关产品推荐
相关产品推荐

