Создание хэш-значения из нескольких столбцов

#sql #hash #amazon-redshift #md5

Вопрос:

У меня есть пример таблицы продаж товаров, которая состоит примерно из 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 столбцов, которые я включил в хэш-функцию, но я также хочу включить в функцию два столбца ДАТЫ и времени, но это не работает. Я использовал этот код, чтобы попытаться включить их, код запускается, но получаемые мной хэш-значения отличаются друг от друга, даже если все значения в столбцах совпадают:

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

Я использовал функцию TRUNC для двух столбцов даты, так как меня не слишком волнуют точные минуты или секунды, в основном меня интересует только сама дата. Как я мог бы включить два столбца даты и времени, не испортив при этом хэш-функцию?

Комментарии:

1. Что значит «не работает»? Вы получаете сообщение об ошибке?

2. нет, он запускается, но хэш-значение отличается, даже если все значения в этой строке совпадают.

Ответ №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, используйте ПОДСТРОКУ(дата,1,10).

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