【问题标题】:Creating hash value from multiple columns从多列创建哈希值
【发布时间】:2021-06-19 04:51:35
【问题描述】:

我有一个示例产品销售表,它由大约 15 列和几千行组成。我最感兴趣的列如下所示:

product_type     currency    amount    order_time               delivered_time
hoodie           GBP         60.0      2021-03-10  14:32:07     2021-03-13  16:05:52
shirt            EUR         30.0      2021-03-20  19:22:32     2021-03-24  11:18:46
...

目前有一个唯一标识符,但它不适用于广泛的分析,一个订单中可以有多个产品,但它们都有不同的标识符,因此您无法匹配它们。

我想要做的是使用哈希函数创建一个新的标识符列,我使用了下面的代码并显示了我得到的示例输出:

SELECT *, Md5(product_type||currency||amount)
FROM sales

product_type     currency    amount   identifier   
Coat             GBP         100.0    825be52c31f1d92584720466d743e2cf
Coat             GBP         100.0    825be52c31f1d92584720466d743e2cf

此代码适用于我已包含在哈希函数中的 3 列,但我也想将两个 DATETIME 列包含到函数中,但它不起作用。我已经使用此代码尝试包含它们,代码运行但即使列中的所有值都匹配,我得到的哈希值也彼此不同:

SELECT *, Md5(product_type||currency||amount||TRUNC(order_time)||TRUNC(delivered_time))

我在两个日期列上使用了 TRUNC 函数,因为我不太关心确切的分钟或秒,主要只对日期本身感兴趣。我怎样才能包含两个日期时间列而不弄乱哈希函数?

【问题讨论】:

  • “不起作用”是什么意思?你有错误吗?
  • 不,它运行但哈希值不同,即使该行中的所有值都匹配。

标签: sql hash amazon-redshift md5


【解决方案1】:

使用to_char(date, 'YYYY-MM-DD') 代替 TRUNC()

 Md5(product_type||currency||amount||to_char(order_time,'YYYY-MM-DD')||to_char(delivered_time,'YYYY-MM-DD'))

或者如果数据类型是string/varchar,使用SUBSTRING(date,1,10)

Md5(product_type||currency||amount||SUBSTRING(order_time,1,10)||SUBSTRING(delivered_time,1,10))

【讨论】:

    猜你喜欢
    • 2011-11-08
    • 2017-04-12
    • 2017-05-04
    • 2021-06-29
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 2018-04-04
    • 2013-12-20
    相关资源
    最近更新 更多