我不是一个真正的后端开发人员,所以我对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的计数多于一行的每一行,但只有那里还有多个不同的deliveryDate。
到目前为止我尝试的是:
SELECT *
FROM myTable
WHERE `transactionID` IN
( SELECT `transactionID`
FROM `myTable`
GROUP BY `transactionID`
HAVING COUNT(*) > 1
)
ORDER BY `transactionID`
我知道我只是在同一笔交易中有多个买入时进行过滤,但我真的不知道该怎么做。此外,由于有很多列,这个查询非常慢,所以我认为可能有一个更好的方向,有些人可以指点我。
谢谢!
答案 0 :(得分:3)
你很亲密。您需要计算不同的日期:
SELECT *
FROM myTable
WHERE `transactionID` IN
( SELECT `transactionID`
FROM `myTable`
GROUP BY `transactionID`
HAVING COUNT(distinct DeliveryDate) > 1
)
ORDER BY `transactionID`
答案 1 :(得分:1)
我想这会更快,它也会删除重复的行(具有相同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
答案 2 :(得分:0)
使用它也可以。
SELECT *
FROM myTable GROUP BY `transactionID`HAVING COUNT(DeliveryDate) > 1 ORDER BY `transactionID`