2017-09-12 33 views
0

トランザクションデータセット(custid、supplierid、transactionid、date)からSQLクエリを作成しようとしています。私はcustIDによって、最大取引が発生したサプライヤーと最近の取引が起こったサプライヤーを探したいと思っていますか?sqlクエリ選択条件

入力

custID - supplierid - transactionid - date 
1  - a   - 1111a   - 9/22/2017 
1  - a   - 1111b   - 9/23/2017 
1  - a   - 1111c   - 9/24/2017 
1  - b   - 1111d   - 9/21/2017 
1  - c   - 1111e   - 9/25/2017 

理想

custID - suppliermax - supplierrcnt - datercnt 
1  - a   - c   - 9/25/2017 
+0

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

+0

特に 'date'フィールドに影響を与えるので、あなたが使用しているSQL DBを指定するべきでしょう。例えばPostgreSQLはネイティブのタイムスタンプ型をサポートしていますが、SQLiteはタイムスタンプを通常は文字列またはintとして保存します。 – sirosen

+0

データはnetezzaでホストされ、SQuirrel SQL Clientを介して接続されます。前もって感謝します。 – user8599523

答えて

0

あなたは、トランザクションの最大数でより多くのサプライヤーを持っている場合、このクエリは、より多くの行を返します。さらに、それは常にただ1つのsupplierrcntサプライヤがあると仮定します。

+0

私は彼がcust_idによって集計したいと思う質問から、たとえサンプルが1つの別個の値しか提供しなかったとしても。 –

+0

@ Error_2646 'cust_id'は入力です。私のソリューションの集約は、(顧客のために)取引数が最も多いサプライヤを見つけるために行われます –

+0

私はあなたのソリューションでcust_idが入力されていることを知っていますが、単純な集計ではなく手動入力またはカーソルが必要です。 –

0

私はNeteezaで一度も働いたことはありませんが、私はこのような分析機能をサポートしていると確信しています。

SELECT cust_id, 
     MAX(
     CASE WHEN suppRN = 1 THEN supplier 
       ELSE NULL 
      END 
     ) AS supplierMax, 
     MAX(
     CASE WHEN tran_rn = 1 THEN supplier 
       ELSE NULL 
      END 
     ) AS supplierrCnt,   
     MAX(
     CASE WHEN tran_rn = 1 THEN date_ 
       ELSE NULL 
      END 
     ) AS datercnt 
    FROM (SELECT cust_id, 
       supplier, 
       date_, 
       ROW_NUMBER() OVER 
       (PARTITION BY cust_id 
         ORDER BY suppCnt DESC 
       ) AS suppRN, 
       tran_rn 
      FROM (SELECT cust_id, 
         supplier, 
         COUNT(*) OVER 
         (PARTITION BY cust_id, 
             supplier 
         ) AS suppCnt, 
         ROW_NUMBER() OVER 
         (PARTITION BY cust_id 
           ORDER BY date_ DESC 
         ) AS tran_rn 
        FROM Customer 
       ) AS TMP 
     ) AS TMP2 
WHERE suppRN = 1 
    OR tran_rn = 1  
GROUP 
    BY cust_id; 
+0

私はカスタマイズしてテストしています。 – user8599523