【问题标题】:Teradata Rank Over Query (Getting one row to left join)Teradata Rank Over Query(让一行左连接)
【发布时间】:2012-05-13 01:31:35
【问题描述】:

您好,我是 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。但是对于名称和地址,我想使用具有更多计数的名称和地址。如果两个名字有相同的 COUNT 我只想要第一行

ID 名称计数

1234 约翰·史密斯 6

1234 约翰尼·史密斯 6

1234 杰史密斯 2

在上面的例子中,我想要 John Smith 这个名字。这是我正在执行的左连接,因为 ID 可能没有名称或地址。这是我正在尝试的方法

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

但是,这并没有让我得到想要的结果。我也尝试使用 ROW NUMBER 而不是 RANK,但仍然没有结果。我应该如何在 TERDATA 中编写这个查询?

【问题讨论】:

  • 我对你的语法有点困惑。在大多数数据库中,窗口函数(例如排名)不能与 group by 一起使用。我认为您想在子查询中进行分组,然后进行排名,反之亦然。
  • 它允许在 teradata 中使用,无需子查询。并且 qury 本身 SELECT ID, ADDRESS, COUNT(*) AS COUNTER, (RANK() OVER (ORDER BY COUNTER DESC) ) AS RNK FROM ADDRESSES GROUP BY ID 工作正常并给出了预期的结果,所以我怀疑这有什么问题
  • 计数是否应该计算 ID/名称组合出现在表中的次数(在现实生活中可能还有更多列)?你能否解释一下为什么当他们的计数相同时,John Smith 被选在 Johnnie Smith 之前?
  • @lins314159 如果两个计数相同,可以选择其中任何一个,所以我们可以选择第一个

标签: sql left-join teradata


【解决方案1】:

我解决了...我需要一个qualify 和一个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-12-07
    • 1970-01-01
    • 1970-01-01
    • 2018-11-13
    • 2020-02-05
    • 2016-05-14
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    相关资源
    最近更新 更多