【问题标题】:Teradata SQL Get Rid of Duplicates with Specific OrderTeradata SQL 消除具有特定顺序的重复项
【发布时间】:2018-02-15 07:11:57
【问题描述】:

我这周刚开始使用 teradata SQL,如果我的措辞不正确,非常抱歉。我最初在 R 中创建了一个脚本来消除表中的重复项,但现在我需要将此代码传输到 SQL 中。以下是一些示例数据:

我想去掉 DELETE 列中的任何 D,按 ID 分区,按 STATUS、DATE 和 AMOUNT 排序(实际日期和金额在 ?s 之前)。我希望 STATUS 按以下顺序排列:P、H、F、U、T。我希望第一行填写 STATUS、DATE 和 AMOUNT(按顺序排列 STATUS)。这是示例输出数据:

我真的被订单问题困住了,我编写的代码根本没有产生任何数据(但没有错误)。

示例代码:

CREATE VOLATILE TABLE new_tble
AS
(SELECT * 
FROM table
QUALIFY row_number() OVER (partition BY ID ORDER BY ID, DATE, AMOUNT)=1
WHERE DELETE <> 'D'
)
with data;

【问题讨论】:

  • 你写的什么代码不会产生任何数据?
  • @TabAlleman 我有多个失败的脚本 :),但我会在这里添加我最新的一个。我只需要将其转换为示例格式。
  • 标签 TSQL 表示 Microsoft SQL Server 的 SQL 方言,而不是 Teradata 的。

标签: sql teradata


【解决方案1】:

这是将您的描述直接翻译成 Teradata SQL,假设 ? 表示 NULL

select *
from tab
where "delete" is null
  and "date" is not null
  and amount is not null
qualify
   row_number() 
   over (partition by id
         order by case status 
                    when 'P' then 1 
                    when 'H' then 2 
                    when 'F' then 3
                    when 'U' then 4 
                    when 'T' then 5 
                  end
                  ,"date"
                  ,amount) = 1

【讨论】:

  • @dnoethThis 工作没有 where 语句。我不确定 SQL 是为空值生成 ?s 还是只是作为 ? 插入。如果我尝试将其更改为 DATE '?' 之类的内容,则会收到此错误:'A string failed conversion to a numeric value'。
  • @user108363 你应该使用 IS NULL 或 IS NOT NULL。
  • @user108363:默认情况下,NULL 排序低于任何其他值,因此如果没有 WHERE,您可能会得到错误的结果。
猜你喜欢
  • 2019-07-30
  • 2020-08-13
  • 2015-06-19
  • 2018-02-08
  • 1970-01-01
  • 2013-11-15
  • 2022-12-01
  • 1970-01-01
  • 2013-10-04
相关资源
最近更新 更多