2016-12-19 3 views
0

私のデータはAmazon Redshiftデータベースに保存されています。私は月ごとにランニングカウントを取得しようとしています。これは私のクエリです:実行回数は、合計値の代わりにすべての値を表示します

SELECT 
TO_CHAR(LD.INITIAL_PURCHASE_DATE,'YYYY-MM') AS INITIAL_PURCHASE, 
COUNT(LD.LOAN_ID) OVER (ORDER BY TO_CHAR(LD.INITIAL_PURCHASE_DATE,'YYYY-MM') ROWS UNBOUNDED PRECEDING) AS TOTAL_LOANS 
FROM LOANS_DETAILS 
INNER JOIN LOANS L ON LD.LOAN_ID = L.ID 
WHERE L.UNDERWRITING_STATUS IN ('...') 
AND LD.INITIAL_PURCHASE_DATE IS NOT NULL 
GROUP BY 
LD.LOAN_ID, 
LD.INITIAL_PURCHASE_DATE; 

私の予想結果は以下の通りである:

INITIAL_PURCHASE|TOTAL_LOANS 
...|... 
2016-10|369 
2016-11|424 

しかし、その代わりに、私はそう

INITIAL_PURCHASE|TOTAL_LOANS 
...|... 
2016-10|366 
2016-10|367 
2016-10|368 
2016-10|369 
2016-11|371 

のような月の毎日のための1つのレコードを取得私がチェック10月には合計369件、11月には424件が確定したので、データが正しいことを知っています。

1か月あたりのローン総数はどのようにして得られますか?


解決 これは正しいクエリです。

SELECT 
TO_CHAR(LD.INITIAL_PURCHASE_DATE,'YYYY-MM') AS INITIAL_PURCHASE_DATE, 
SUM(COUNT(LD_LOANS.LOAN_ID)) OVER (ORDER BY TO_CHAR(LD.INITIAL_PURCHASE_DATE,'YYYY-MM') ROWS UNBOUNDED PRECEDING) AS TOTAL_LOANS 
FROM LOANS_DETAIL LD 
INNER JOIN LOANS L ON LD.LOAN_ID = L.ID 
WHERE L.UNDERWRITING_STATUS IN ('...') AND LD.INITIAL_PURCHASE_DATE IS NOT NULL 
GROUP BY TO_CHAR(LD.INITIAL_PURCHASE_DATE,'YYYY-MM') 

答えて

2

あなたgroup byニーズではない、日、月によって可能にする、とあなたはGROUP BYからLOAN_IDを削除する必要があります。

SELECT TO_CHAR(LD.INITIAL_PURCHASE_DATE, 'YYYY-MM') AS INITIAL_PURCHASE, 
     SUM(COUNT(LD.LOAN_ID)) OVER (ORDER BY TO_CHAR(LD.INITIAL_PURCHASE_DATE,'YYYY-MM') ROWS UNBOUNDED PRECEDING) AS TOTAL_LOANS 
FROM LOANS_DETAILS LD INNER JOIN 
    LOANS L 
    ON LD.LOAN_ID = L.ID 
WHERE L.UNDERWRITING_STATUS IN ('...') AND 
     LD.INITIAL_PURCHASE_DATE IS NOT 
GROUP BY TO_CHAR(LD.INITIAL_PURCHASE_DATE, 'YYYY-MM') 

注:

  • 私はアマゾン赤方偏移は、エイリアスを可能にすると思いますGROUP BYにあるので、GROUP BY INITIAL_PURPOSE, LD.LOAN_IDを使用できます。
  • SUM(COUNT(*))は、あなたに合計を与える必要があります。
  • LOAN_IDは、月ごとの合計を求める場合はGROUP BYには含まれません。
+0

私はすでに試してみました。 AS TOTAL_LOANS'は '[Amazon](500310)を返します。無効な操作:集約関数の呼び出しには、次のようなものがあります。 'SUM(COUNT(LUT_LOANS.LOAN_ID)OVER(LUT_LOANS.INITIAL_PURCHASE_DATE、' YYYY-MM ')行のUNBOUNDED PRECEDING)ネストされた集計またはウィンドウ関数; – Alan

+0

@Alan。 。 。注意深く見てみると、この答えは集計関数の境界を定めるウィンドウ関数を使用していることになります。 –

+0

申し訳ありません。私の間違いを実感しました。 'sum(COUNT(*))'が働いた。ありがとうございました。 – Alan

0

これはあなたが目指していたものです。
INITIAL_PURCHASE( 'YYYY-MM')でグループ化し、カウント(*)で実行中の合計を実行します。

SELECT  TO_CHAR(LD.INITIAL_PURCHASE_DATE,'YYYY-MM') AS INITIAL_PURCHASE 

      ,sum(count(*)) OVER 
       (ORDER BY TO_CHAR(LD.INITIAL_PURCHASE_DATE,'YYYY-MM') 
         ROWS UNBOUNDED PRECEDING) AS TOTAL_LOANS 

FROM     LOANS_DETAILS LD 
      INNER JOIN LOANS   L 
      ON   LD.LOAN_ID = L.ID 

WHERE  L.UNDERWRITING_STATUS IN ('...') 
     AND LD.INITIAL_PURCHASE_DATE IS NOT NULL 

GROUP BY INITIAL_PURCHASE 

P.S.
私は間違って使用すると、別名INITIAL_PURCHASEがGROUP BY句で認識されるべきだと思います。TO_CHAR(LD.INITIAL_PURCHASE_DATE,'YYYY-MM')

+0

混乱のために申し訳ありません。これはそれでなければなりません。 –

+0

それは働いた。 'sum(COUNT(*))'はそのトリックを行いました。ありがとうございました。 – Alan

+0

偉大な:-)申し訳ありませんが再び申し訳ありません。 –

関連する問題