以下のスレッドで説明する例とほぼ同じ状況になります。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を解決できず、その値を比較することができませんでした。日付。
私は何をしたいのですか?
それは非常に巨大になります。また、あなたのクエリのgroup by句はtdateしか持っていません。グループ句で指定されたmax(cdate)以外のすべての列を選択する必要があります。 – Sathiesh
s_transactionテーブルにプライマリキーがありますか? s_transactionテーブルの "transaction id"フィールドのようなものがあれば、 "transaction id"でグループ化してから最大cdateを取得して終了することができます。 –
私は一意のキーを持っていません。そのビューは基本的にビューであるため、ビューには列があります。私はrow_number()を作成してプライマリキーとして使用しようとしましたが、うまく見えません。私はまた、Impalaの欠陥であるかどうか疑問に思っています...もし私が働いているrow_number()で解決策を得たら、ここに投稿します – Sathiesh