sql - 从多列创建哈希值
问题描述
我有一个示例产品销售表,它由大约 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 函数,因为我不太关心确切的分钟或秒,主要对日期本身感兴趣。我怎样才能包含两个日期时间列而不弄乱哈希函数?
解决方案
使用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))
推荐阅读
- php - 如果未设置参数,如何给出默认值
- mysql - ELK 数据摄取:elasticsearch 将文本视为布尔值,即使映射显示类型为“文本”
- ios - 快速转换日期而不会丢失
- mysql - 如何从 DO Droplet Ubuntu 18.04 连接到 DO Managed MySQL 8?
- spring-mvc - ms 图形 api。时区没有响应变化
- php - 将动态电子邮件地址添加到发布表单
- java - java.sql.SQLException:javaFX 应用程序上的 SQLite JDBC 驱动程序未实现
- r - 为什么我不能再下载 R 3.3.2 中的某些包?
- graph - 无向图中的连通分量示例
- python-3.x - opengv 安装不在 pip3 列表中