1

各ユーザーのn番目の時系列の訪問日を返すTeradataSQLクエリを作成しようとしています。例えば、

user  |  visit_date
---------------------
  a      1/1      
  b      1/10
  c      1/20
  a      1/3
  a      1/4
  b      1/5
  c      1/15
  b      1/9


> magic_query_for_Second_visit;
user  |  second
------------------
  a       1/3
  b       1/9
  c       1/20

以下のようなことを試しましたが、Teradataは「順序付けられた分析関数はWHERE句で許可されていません」と叫びました。しばらく髪を引っ張ってきましたが、あまり進歩していません。誰かこれを見た?

select user,
  row_number() over (partition by user order by visit_date desc) as rnum

from visitstable
  where rnum = 2

除外するとwhere、私の結果は有望に見えます...必要なものを抽出できません!

 user |  visit_date | rnum
---------------------------
  a        1/1          1
  a        1/3          2
  a        1/4          3
  b        1/5          1
  b        1/9          2
  b        1/10         3 
  c        1/15         1
  c        1/20         2

助けてくれてありがとう!

4

3 に答える 3

1

ああ、天国は私がドキュメントを見る必要があることを禁じています。参考までに、qualify順序付けられた分析制約を指定できるようです。ただし、qualifyANSIではないので、ポータブルソリューションのポイントをまだ配布しています...

できます:

select user,
  row_number() over (partition by user order by visit_date desc) as rnum

from visitstable
qualify rnum=2

...そして取得...

user  |   visit_date  |  rnum
-----------------------------
  a        1/3            2
  b        1/9            2
  c        1/20           2

ブックマークしてください!:)

于 2010-07-09T15:22:43.607 に答える
1
SELECT 
    user

FROM 
    visitstable

QUALIFY ROW_NUMBER() OVER (
    PARTITION BY 
        user
    ORDER BY 
        visit_date DESC) = 2

コメントから、Teradata固有のに必ずしも依存する必要はないことがわかりますQUALIFY。以下は、別のチャップの回答に基づいた一種のポータブルソリューションです(多くのRDBMSが現在CTEをサポートしているため)。

WITH tmp (user, rnum) AS (
    SELECT 
        user, 
        ROW_NUMBER() OVER (
            PARTITION BY 
                user 
            ORDER BY 
                visit_date DESC) AS rnum 
    FROM 
        visitstable)
SELECT
    tmp.*
FROM 
    tmp
WHERE 
    tmp.rnum = 2
于 2010-07-09T15:22:47.657 に答える
0

どのバージョンのSQLを使用していますか?MS SQL Serverの新しいバージョンのように見えるので、次のような「共通テーブル式」を使用してみてください...

with cte as ( select user, row_number() over (partition by user order by visit_date desc) as rnum from visitstable )

select * from cte where rnum = 2

構文を少し調整する必要があるかもしれませんが、それが一般的な原則です。

于 2010-07-09T15:05:47.777 に答える