#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))