我不是一个真正的后端开发人员,所以我几乎没有使用sql的经验。我需要从表中过滤“每月购买”,其中客户将购买相同的交易产品,在不同的日期发货。
假设我把这个放在桌子上:
transactionID | deliveryDate
------------- | ------------
1 | 2013-11-24
1 | 2013-11-24
2 | 2013-11-26
3 | 2013-11-10
3 | 2013-11-17
3 | 2013-11-24
4 | 2013-11-10
4 | 2013-11-10
4 | 2013-11-17
4 | 2013-11-17我想要的结果是:
transactionID | deliveryDate
------------- | ------------
3 | 2013-11-20
3 | 2013-11-22
3 | 2013-11-24
4 | 2013-11-10
4 | 2013-11-10
4 | 2013-11-17
4 | 2013-11-17交易3和交易4是唯一符合我的标准的交易,因为交易1,虽然在同一交易中有多个购买,但交付日期是相同的。事务2也不适合我需要购买多个项目。因此,基本上我需要选择transactionID计数超过1的每一行,但仅当存在多个不同的deliveryDate时才选择。
到目前为止,我尝试的是:
SELECT *
FROM myTable
WHERE `transactionID` IN
( SELECT `transactionID`
FROM `myTable`
GROUP BY `transactionID`
HAVING COUNT(*) > 1
)
ORDER BY `transactionID`我知道我只是在同一交易中有多个买入时进行过滤,但我真的不知道如何遵循这一点。此外,由于有更多的列,这个查询相当慢,所以我认为可能有一个更好的方向,你们中的一些人可以给我指出来。
谢谢!
发布于 2013-04-17 08:55:49
你已经很接近了。你需要计算不同的日期:
SELECT *
FROM myTable
WHERE `transactionID` IN
( SELECT `transactionID`
FROM `myTable`
GROUP BY `transactionID`
HAVING COUNT(distinct DeliveryDate) > 1
)
ORDER BY `transactionID`发布于 2013-04-17 10:42:18
我认为这样会更快,而且还可以删除重复的行(具有相同id和日期的行)
SELECT
a.transactionID,
a.deliveryDate,
count( b.transactionID )
FROM
temp a
JOIN temp b ON ( a.transactionID = b.transactionID AND a.deliveryDate <> b.deliveryDate )
GROUP BY
a.transactionID,
a.deliveryDate
HAVING
count( b.transactionID ) > 1发布于 2016-09-19 15:11:25
使用此方法也可以工作。
SELECT *
FROM myTable GROUP BY `transactionID`HAVING COUNT(DeliveryDate) > 1 ORDER BY `transactionID`https://stackoverflow.com/questions/16049635
复制相似问题