首页 > 解决方案 > 从多列创建哈希值

问题描述

我有一个示例产品销售表,它由大约 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 函数,因为我不太关心确切的分钟或秒,主要对日期本身感兴趣。我怎样才能包含两个日期时间列而不弄乱哈希函数?

标签: sqlhashamazon-redshiftmd5

解决方案


使用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'))

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

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

推荐阅读