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

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 に答える