MySQL重复条目搜索具有选择性日期标准

时间:2016-11-30 02:45:45

标签: mysql

在单个查询中选择有效的“重复条目”时,无法绕过头脑。

在下面的示例中,可以存在多个StockNo的重复Date。我想在StockNo中搜索重复的条目,如果在StockNo当前的YEAR-MONTH中找到至少1条Date条记录,那么我还需要选择其中可能存在的合作伙伴任何其他年份。这可能吗?

示例查询:

SELECT * FROM `sales`
WHERE `StockNo` IN 
    (SELECT `StockNo` FROM `sales` GROUP BY `StockNo` HAVING COUNT(*) > 1)
    AND `Date` LIKE '2016-11-%'
ORDER BY `StockNo`, `TransactionID`;

示例数据:

ID | StockNo | Date
1 | 1 | 2016-11-01
2 | 1 | 2016-11-10
3 | 2 | 2016-11-05
4 | 2 | 2016-10-29
5 | 3 | 2016-10-25
6 | 3 | 2016-10-15

通过我的示例查询和数据,我有3对重复条目。很明显,由于AND Date LIKE '2016-11-%',我只返回3条记录(ID为1,2和3),但是我需要返回ID的1,2,3,4。我想忽略ID的5& 3。 6因为它们都不属于当月。

希望这是有道理的。感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:2)

SELECT StockNo
FROM sales
GROUP BY StockNo
HAVING SUM(CASE WHEN DATE_FORMAT(Date, '%Y-%m') = '2016-11' THEN 1 ELSE 0 END) > 0

如果您还想在上述查询中检索匹配库存号的完整记录,您只需添加一个联接:

SELECT s1.*
FROM sales s1
INNER JOIN
(
    SELECT StockNo
    FROM sales
    GROUP BY StockNo
    HAVING SUM(CASE WHEN DATE_FORMAT(Date, '%Y-%m') = '2016-11' THEN 1 ELSE 0 END) > 0
) s2
    ON s1.StockNo = s2.StockNo

在这里演示:

SQLFiddle

答案 1 :(得分:0)

非常感谢蒂姆指出我正确的方向。你的答案很接近,但它仍然只返回当月的记录,最后我使用了以下查询:

SELECT s1.* FROM `sales` s1
INNER JOIN
(
    SELECT * FROM `sales` GROUP BY `StockNo` HAVING COUNT(`StockNo`) > 1
    AND SUM(CASE WHEN DATE_FORMAT(`Date`, '%Y-%m')='2016-11' THEN 1 ELSE 0 END) > 0
) s2
    ON s1.StockNo=s2.StockNo

这个人已经躲过了我一段时间。