2017-06-21 9 views
1

ここに初めて投稿する。貧弱なフォーマットのおかげで他の2つのフィールドでグルーピングする際の最大datetimeの検索 - SQLクエリ

注文情報を含む表があります。その中には主キーOrderIDがあります。これは、誰かがカートを作成したときに生成されます。手元にあるタスクは、同じ電子メールアドレスを使用して最後に購入した注文(この場合は60日とする)を示すことです。だから、基本的な選択は、次のようになります。

SELECT orderid,purchasedate,emailaddress FROM basket 

今 - トリッキーな部分は、MAX(受注)とpurchasedateは必ずしもあなたがそれらを期待するどのように動作しないことです。つまり、同じ電子メールアドレスを持つ人は、1月にカートを起動し、3月に新しいカートを作成して元のものを購入している可能性があります。このシナリオでは、最も大きなIDが必ずしも最後に購入されたとは限りませんので、単にmax orderIDを取得することはできません。最終的に私が探している出力は、 "CurrentOrderID | EmailAddress | CurrentPurchaseDate | PreviousOrderID | PreviousPurchaseDate"のようになります。

問題は少し難解です。基本的に私は最近購入したBY emailaddressを選択しようとしていますが、対応するorderIDも含んでいます。

ありがとうございます。

+3

どのRDBMSを使用していますか? –

+0

ようこそStackOverflowへ!サンプルデータとそれに基づいて正確な出力を提供してください。 [良いSQLの質問方法](https://meta.stackoverflow.com/a/271056/1920232) – peterm

+0

申し訳ありませんが、それを含める必要があります。 SQL Server 2012 –

答えて

0

私が説明上記から理解するものから、私はカウントサブクエリで、以下のお勧め(フォーマットは、Oracleのためである以下は、使用RDBMSそれに基づいて異なります)

select max(orderid) as orderid,purchasedate,emailaddress 
from (select max(purchasedate) as purchasedate,orderid,emailaddress 
     from market group by orderid,emailaddress) market_external 
group by purchasedate,emailaddress; 

私は、これはあなたが探しているものです願っていますために。

0

の場合、以下のクエリは最新の購入記録とそれ以降の購入記録を結合します。

SELECT 
    b1.orderId AS currentOrderId, 
    b1.emailaddress, 
    b1.purchasedate AS currentPurchaseDate, 
    b2.orderId AS previousOrderId, 
    b2.purchasedate AS previousPurchaseDate 
FROM basket AS b1 
    JOIN basket AS b2 ON(b1.emailaddress = b2.emailaddress AND b1.purchasedate > b2.purchasedate) 
ORDER BY b1.emailaddress, b1.purchasedate DESC, b2.purchaseDate DESC 

最も近い現在の購入日に前回の購入日を持つレコードを見つけるには、カウンタを作成し、唯一の順序= 0を持つレコードを選択するために、MySQLの変数を使用することができます。カウンタはORDER BY b1.emailaddress、b1.purchasedate DESC、b2.purchaseDate DESCによって正しく動作します。電子メールが変更されたときに追跡する別の変数を使用して、電子メールごとにカウンタがリセットされます。

SELECT 
    b1.orderId AS currentOrderId, 
    b1.purchasedate AS currentPurchaseDate, 
    b2.orderId AS previousOrderId, 
    b2.purchasedate AS previousPurchaseDate, 
    IF(@previous != b1.emailaddress, @counter:=0, @counter:[email protected]+1) AS ordering, 
    IF(@previous != b1.emailaddress, @previous:= b1.emailaddress, @previous) AS emailaddress 
FROM basket AS b1 
    JOIN basket AS b2 ON(b1.emailaddress = b2.emailaddress AND b1.purchasedate> b2.purchasedate), 
    (SELECT @counter:=0, @previous:='') AS tmp 
HAVING ordering = 0 
ORDER BY b1.emailaddress, b1.purchasedate DESC, b2.purchaseDate DESC 
+0

私はこれを実行するように見えることはできません - あなたがSELECTでそれを追加しようとしている場合、私たちはケーシングを使用してはいけませんか? IF関数が正しく機能しているかどうかわかりません。SQLServer2012 エラー: メッセージ156、レベル15、状態1、行9 キーワード 'IF'の近くに構文が正しくありません。 メッセージ102、レベル15、状態1、行9 '、'の近くの構文が正しくありません。 メッセージ102、レベル15、状態1、行10 '、'の近くの構文が正しくありません。 メッセージ102、レベル15、状態1、行13 ':'の近くの構文が正しくありません。 –

+0

これはMySQLのためのもので、私はSQLServerのための等価物を知らない – N3SS4H

関連する問題