0

こんにちは Teradata を初めて使用し、問題が発生しています

各人に与えられた固有の ID を格納する ID テーブルがあります。

CREATE TABLE IDS(
ID VARCHAR(8),
UPDATED_DATE DATE)

次に、IDS の人口統計情報を格納する主キーを持たない名前と住所のテーブルがあります。

CREATE TABLE NAMES(
ID VARCHAR(8),
NAME VARCHAR(50))
CREATE TABLE ADRRESSES(
ID VARCHAR(8)
ADDRESS VARCHAR(200))

各 ID は複数の名前と IDS を持つことができるようになりました。ただし、名前と住所については、カウントが多いものを使用したいと思います。2 つの名前の COUNT が同じ場合、最初の行だけが必要です

ID名カウント

1234 ジョン・スミス 6

1234 ジョニースミス 6

1234 Jスミス2

上記の例では、John Smith という名前が必要です。ID には名前やアドレスがない場合があるため、実行している左の Join を次に示します。これが私が試していることです

SELECT * FROM
(SELECT ID as V_ID from IDS) a
LEFT JOIN
(SELECT ID, NAME, COUNT(*) AS COUNTER,(RANK() OVER(ORDER BY COUNTER DESC)) AS RNK
FROM NAMES 
GROUP BY ID)b
ON a.ID = b.ID
AND b.RNK = 1            -- Should give me only the first row
LEFT JOIN
(SELECT ID, ADDRESS, COUNT(*) AS COUNTER, (RANK() OVER (ORDER BY COUNTER DESC) ) AS RNK
FROM ADDRESSES
GROUP BY ID) c
ON c.ID = a.ID
And c.RNK = 1

しかし、これは私に望ましい結果をもたらしません。RANK の代わりに ROW NUMBER を使用してみましたが、まだ結果はありません。このクエリを TERDATA でどのように記述すればよいですか?

4

1 に答える 1

0

私はそれを解決しました...私はaqualifyとaが必要でしたpartition by

SELECT * FROM
    (SELECT ID as V_ID from IDS) a
    LEFT JOIN
    (SELECT ID, NAME, COUNT(*) AS COUNTER
    FROM NAMES
    GROUP BY ID
    qualify ROW_NUMBER() OVER(PARTITION BY ID ORDER BY COUNTER DESC) = 1
    )b
    ON a.ID = b.ID
    LEFT JOIN
    (SELECT ID, ADDRESS, COUNT(*) AS COUNTER
    FROM ADDRESSES
    GROUP BY ID
    qualify ROW_NUMBER() OVER(PARTITION BY ID ORDER BY COUNTER DESC) = 1
    ) c
    ON c.ID = a.ID
于 2012-05-14T21:27:42.307 に答える