【问题标题】:How do I prioritize date format 'MM/DD/YYYY' over 'MM-DD-YYYY'如何将日期格式“MM/DD/YYYY”优先于“MM-DD-YYYY”
【发布时间】:2020-10-29 06:10:39
【问题描述】:

如何在 Teradata 中编写查询,以便如果字段 Cont_Num 具有不同数据格式的重复项('MM/DD/YYYY' 和 'MM-DD-YYYY'),查询应该只返回带日期的字段格式 'MM/DD/YYYY',但如果 Cont_Num 没有重复,并且存在的日期格式只有 'MM-DD-YYYY',它应该返回该字段 我拥有的数据示例如下

SELECT Cont_Num,FILL_DATE, 
FROM USS_LOAD_LOG_TABLES.Members 
WHERE Cont_Num IN ( 
1807369967,
1807453269,
1916796684,
2015276712,
2001306287
)
ORDER BY Cont_Num,FILL_DATE;

结果

Cont_Num        FILL_DATE
1807369967  11-13-2018
1807369967  11/13/2018
1807453269  11-18-2018
1807453269  11/18/2018
1916796684  06-11-2019
1916796684  6/11/2019
2001306287  01-08-2020
2001306287  1/8/2020
2015276712  03-28-2020

预期结果

结果

Cont_Num        FILL_DATE
1807369967  11/13/2018   
1807453269  11/18/2018
1916796684  6/11/2019
2001306287  1/8/2020
2015276712  03-28-2020

【问题讨论】:

  • 所以您的 fill_date 列实际上是 varchar(10) 什么的,而不是实际日期?
  • 是的,它是 varchar(10)
  • 这太可怕了。是否还有另一列,某种标识符,您可以使用它来了解该行上的日期是如何构成的?
  • 不幸的是,没有其他列可以使用标识符
  • 我正在尝试更新一个表,目标表中的所有 FILL_DATE 的格式都为 'MM/DD/YYYY',我尝试使用 ROW_NUM 如下,但我没有得到结果 QUALIFY ROW_NUMBER() OVER (PARTITION BY Cont_Num ,PRES_ID ORDER BY Cont_Num ,PRES_ID DESC) = 1)

标签: teradata teradata-sql-assistant teradata-aster


【解决方案1】:

当然,你应该尝试修复你的数据模型,日期应该存储为 DATE。

您可以将前导零添加到单个数字的日期/月份并删除连字符/破折号以将字符串标准化为通用格式,该格式可用于 ROW_NUMBER:

qualify
   row_number()
   over (partition by Cont_Num, RegExp_Replace(RegExp_Replace(FILL_DATE, '\b([\d])\b', '0\1'), '\D')
         order by case when FILL_DATE like '%/%' then 1 else 2 end) = 1

希望只使用 MMDDYYYY 格式。

【讨论】:

  • 非常感谢,我已经按照你的建议做了,会尽力给你反馈。
猜你喜欢
  • 2016-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-18
相关资源
最近更新 更多