0

以下のスレッドで説明する例とほぼ同じ状況になります。Impala:テーブル1の日付がmax(date)未満の表2の行のみが返されるデータを選択します。

select data where date is max(date) less than x

私は

s_currency

cdate       ratio      currency            
------------------------------------------------------------------- 
2017-06-06 00:00:00.0   1       USD             
2017-06-05 00:00:00.0   1       USD             
2017-06-04 00:00:00.0   1       USD  

s_transaction

tdate       amount     currency            
------------------------------------------------------------------- 
2017-06-05 00:00:00.0   100      USD             
2017-06-08 00:00:00.0   55      USD  
2017-06-08 00:00:00.0   55      USD  
2017-06-08 00:00:00.0   60      USD  

としてテーブルを持っていると私が望む結果が

です10

ここで、cdateはtdateに基づいていなければならず、最新の通貨日付は取引日と同じかそれより早いものでなければなりません。

他のポストのソリューションは、select句でサブクエリを使用し、Impalaでは機能しません。私はCTEを使ってみましたが、サブクエリに参加しましたが、どれも望みの結果を返していません。以下は、私は、私が構築されたクエリの一部、およびその結果

SELECT tdate, amount, t1.currency, ratio, cdate FROM s_transaction t1 , s_currency t2 
     WHERE t1.currency = t2.currency AND 
     t2.cdate = (select max(cdate) from s_currency 
        where currency = t1.currency and cdate <= t1.tdate); 

されているが、これは、テーブルを結合し、取引日という少ないすべての通貨の取引を返すので、私はそう

tdate       amount  currency  ratio  cdate 
------------------------------------------------------------------------------------------ 
2017-06-08 00:00:00.0   60   USD   1   2017-06-05 00:00:00.0   
2017-06-08 00:00:00.0   60   USD   1   2017-06-06 00:00:00.0   
2017-06-08 00:00:00.0   60   USD   1   2017-06-04 00:00:00.0   
2017-06-05 00:00:00.0   100   USD   1   2017-06-05 00:00:00.0   
2017-06-05 00:00:00.0   100   USD   1   2017-06-04 00:00:00.0   
2017-06-08 00:00:00.0   55   USD   1   2017-06-05 00:00:00.0   
2017-06-08 00:00:00.0   55   USD   1   2017-06-06 00:00:00.0   
2017-06-08 00:00:00.0   55   USD   1   2017-06-04 00:00:00.0   
2017-06-08 00:00:00.0   55   USD   1   2017-06-05 00:00:00.0   
2017-06-08 00:00:00.0   55   USD   1   2017-06-06 00:00:00.0   
2017-06-08 00:00:00.0   55   USD   1   2017-06-04 00:00:00.0 

を取得しますmax(cdate)を取り除き、limit 1で注文を使用しましたが、Impalaはそのがサポートされていない相関サブクエリにLIMIT句を指定しているというエラーをスローします。

私はCTEを使用してみましたし、

with lastupdate as (
select t2.currency, ratio, max(cdate) as cdate from s_currency t2 join s_transaction t1 
on cdate <= tdate and t2.currency = t1.currency group by t2.currency, ratio limit 1 
) select t11.*, lst.ratio, lst.cdate 
from s_transaction t11 join lastupdate lst   

を書きました。しかし、ここでCTEは、一つの値を選ぶと、すべてのトランザクションのためにそれを使用していますので、私は6月5日に

tdate       amount  currency  ratio  cdate 
------------------------------------------------------------------------------------------- 
2017-06-05 00:00:00.0   100   USD   1   2017-06-06 00:00:00.0   
2017-06-08 00:00:00.0   55   USD   1   2017-06-06 00:00:00.0   
2017-06-08 00:00:00.0   60   USD   1   2017-06-06 00:00:00.0   
2017-06-08 00:00:00.0   55   USD   1   2017-06-06 00:00:00.0   

トランザクションを取得します

私はサブクエリでrow_number()関数を試してみましたが、t1.tdateを解決できず、その値を比較することができませんでした。日付。

私は何をしたいのですか?

答えて

0

私は以下のSQL文をmysql dbでテストしました。これは動作します。私はそれゆえtdateによってグループ化することは、私を助けにはなりませんs_transactionテーブルに複数のトランザクションを持っています...また、私は同じ選択に集約関数を使用して、私の実際の表に示されている列が複数ある

select tdate,amount,b.currency,ratio,max(cdate) from s_transaction a,s_currency b where a.tdate>=b.cdate group by tdate 
+0

それは非常に巨大になります。また、あなたのクエリのgroup by句はtdateしか持っていません。グループ句で指定されたmax(cdate)以外のすべての列を選択する必要があります。 – Sathiesh

+0

s_transactionテーブルにプライマリキーがありますか? s_transactionテーブルの "transaction id"フィールドのようなものがあれば、 "transaction id"でグループ化してから最大cdateを取得して終了することができます。 –

+0

私は一意のキーを持っていません。そのビューは基本的にビューであるため、ビューには列があります。私はrow_number()を作成してプライマリキーとして使用しようとしましたが、うまく見えません。私はまた、Impalaの欠陥であるかどうか疑問に思っています...もし私が働いているrow_number()で解決策を得たら、ここに投稿します – Sathiesh

関連する問題