Как создать список уникальных/различных идентификаторов в SQL

avatar
bob
8 августа 2021 в 19:21
68
1
0

У меня есть код SQL с 3 столбцами. (1) UUID (2) отметка времени 1 (3) отметка времени 2 . Я пытаюсь создать список, который принимает уникальные UUID и первое появление временной метки 1. Я использовал отдельную функцию, но она не работает. Может кто-нибудь помочь понять, что такое правильный код.

Спасибо

with raw_data as ( select UUID, cast(datestring as timetamp) as date1 date2 from XYZ )

    Select distinct UUID, date1, date2
    from raw_data

raw_data


ID #### Дата1 (строка) #### дата2 (отметка времени)

  1.   2021-07-05          2012-07-05
    
  2.   2021-07-05           2012-12-12
    
  3.    2021-07-12             2018-04-07
    
  4.    2021-07-19              2012-12-12
    

Желаемый результат:

  1. 2021-07-05. 05.07.2012
  2. 2021-07-05 2012-12-12
  3. 2021-07-12 2018-04-07
Источник
Guru Stron
8 августа 2021 в 19:28
2

Не могли бы вы добавить примеры данных и ожидаемых результатов, а также код, который вы пробовали?

bob
8 августа 2021 в 19:32
0

Я хотел бы. Но это внутренние данные компании. Мои необработанные данные имеют 3 столбца. (1) UUID (2) Временная метка 1 (3) Временная метка 2. Я применил отдельную команду к UUID, но все равно получаю те же необработанные данные

Guru Stron
8 августа 2021 в 19:33
0

Я сильно сомневаюсь, что вы не можете поделиться этой кучей UUID и временных меток. Вы можете немного изменить их, если хотите.

bob
8 августа 2021 в 21:00
1

поделился примером кода и выводом

ggordon
8 августа 2021 в 22:14
0

Предполагается ли, что идентификатор № 4 будет 3 на основе ожидаемых результатов? или ваши ожидаемые результаты должны включать строку с идентификатором 4?

Ответы (1)

avatar
ggordon
8 августа 2021 в 20:55
0

В следующей таблице используется группа по и MIN для получения первого вхождения timestamp1.

SELECT
    UUID,
    MIN(timestamp1) as first_occurrence_of_timestamp_1
FROM
   mytable
GROUP BY
   UUID

Изменить 1

В ответ на ваше преобразование метки времени я запустил в кусте следующее и получил следующие результаты:

WITH XYZ AS (
    SELECT 1 as UUID, '2021-07-05' as datestring, '2012-07-05' as date2 
    UNION ALL
    SELECT 2, '2021-07-05', '2012-12-12'
    UNION ALL
    SELECT 3, '2021-07-12', '2018-04-07'
    UNION ALL
    SELECT 3, '2021-07-19', '2012-12-12'
),
raw_data AS (
    SELECT
        UUID,
        CAST(datestring as TIMESTAMP) date1,
        date2
    FROM XYZ
)
SELECT
    UUID,
    MIN(date1) as first_occurrence_of_timestamp_1,
    MIN(date2) as earliest_date_2
FROM 
    raw_data
GROUP BY 
    UUID

Выходы:

uuid first_occurrence_of_timestamp_1 самая ранняя_дата_2
1 2021-07-05 00:00:00.0 2012-07-05
2 2021-07-05 00:00:00.0 2012-12-12
3 2021-07-12 00:00:00.0 2012-12-12

Дайте мне знать, если это сработает для вас

bob
8 августа 2021 в 21:07
0

Спасибо за это! Я попробовал команду MIN(). Но это дает мне вывод, где я получаю уникальный UUID в col_1, но для col_2 я просто получаю 1 вывод. Результатом является 200 000 уникальных строк UUID для col_1 (что ожидается) и 200 000 строк только 1 даты для col_2, хотя на самом деле должно было быть несколько дат.

bob
8 августа 2021 в 21:10
0

Также для уточнения. Временная метка на самом деле является строкой, но я преобразовал ее в временную метку, используя код cast(datestr as timestamp).

bob
8 августа 2021 в 21:11
0

Происходит еще одна интересная вещь, когда я удаляю datestr и просто делаю простой отдельный UUID. Я получаю правильный результат. Я делаю что-то не так с этой строкой --> преобразование метки времени

bob
8 августа 2021 в 21:13
0

Кроме того, внес изменения в исходный вопрос. Где я делюсь своим кодом.

ggordon
8 августа 2021 в 22:20
0

@bob Я задал дополнительный вопрос, основываясь на вашем образце вывода и ожидаемых результатах. Я также обновил свой ответ воспроизводимым примером, который я запустил в улье, относящимся к вашему преобразованию временной метки со строкой, это работает. Отличие, с другой стороны, предоставляет 2 строки для записей с id=3.