3

我不是真正的后端开发人员,所以我对 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`

我知道我只是在同一笔交易中有多个购买时进行过滤,但我真的不知道如何遵循这一点。此外,由于有更多的列,这个查询非常慢,所以我认为可能有一个更好的方向,你们中的一些人可以指出我。

谢谢!

4

3 回答 3

3

你很亲密。您需要计算不同的日期:

SELECT *
FROM myTable
WHERE `transactionID` IN
    (     SELECT `transactionID`
          FROM `myTable`
          GROUP BY `transactionID`
          HAVING COUNT(distinct DeliveryDate) > 1
    )
ORDER BY `transactionID`
于 2013-04-17T00:55:49.037 回答
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
于 2013-04-17T02:42:18.233 回答
0

使用这个也可以。

SELECT *
    FROM myTable GROUP BY `transactionID`HAVING COUNT(DeliveryDate) > 1 ORDER BY `transactionID`
于 2016-09-19T07:11:25.283 回答