SnowSQL для выбора дня и времени отдельно

Источник - это ТРИ столбца, где третий столбец (ЧАСЫ) имеет тип VARCHAR и имеет значения CSV:

Monday, 10:30AM–12AM, Tuesday, 10:30AM–12AM, Wednesday, 10:30AM–12AM, Thursday, 10:30AM–12AM, Friday, 10:30AM–12AM, Saturday, 10:30AM–12AM, Sunday, 10:30AM–12AM

Желаемый вывод в 4 столбцах, где ЧАСЫ будут переведены в столбцы ДЕНЬ и РАСПИСАНИЕ.

Я БЫПРОДАВЕЦДЕНЬРАСПИСАНИЕ
1001азбукаПонедельник10:30–12:00
1001азбукаВторник10:30–12:00
1001азбукаСреда10:30–12:00
1001азбукаЧетверг10:30–12:00
1001азбукаПятница10:30–12:00
1001азбукаСуббота10:30–12:00
1001азбукаВоскресенье10:30–12:00

Таким образом, 1 ID, ПОСТАВЩИК с 1 ЧАСОМ необходимо преобразовать в 7 строк.

Вот пример таблицы с образцами записей:

CREATE TABLE t1 (id NUMBER, VENDOR VARCHAR2, HOURS VARCHAR2);

INSERT INTO t1 (id, vendor, hours)
VALUES 
(1001, 'ABC', 'Monday, 07:00AM–12AM, Tuesday, 10:30AM–12AM, Wednesday, 10:30AM–12AM, Thursday, 10:30AM–12AM, Friday, 10:30AM–12AM, Saturday, 10:30AM–12AM, Sunday, 10:30AM–12AM'),
(1002, 'DEF', 'Monday, 08:00AM–01PM, Tuesday, 08:00AM–01PM, Wednesday, 08:00AM–01PM, Thursday, 08:00AM–01PM, Friday, 08:00AM–01PM, Saturday, 10:30AM–12AM, Sunday, 10:30AM–01PM'),
(1003, 'GHE', 'Monday, 09:00AM–02PM, Tuesday, 09:00AM–02PM, Wednesday, 09:00AM–02PM, Thursday, 09:00AM–02PM, Friday, 09:00AM–02PM, Saturday, 10:30AM–12AM, Sunday, 10:30AM–12AM'),
(1004, 'IJK', 'Monday, 10:00AM–03PM, Tuesday, 10:00AM–03PM, Wednesday, 10:00AM–03PM, Thursday, 10:00AM–03PM, Friday, 10:00AM–02PM, Saturday, 10:30AM–12AM, Sunday, 10:30AM–12AM'),
(1005, 'LMN', 'Monday, 10:30AM–04PM, Tuesday, 10:30AM–12AM, Wednesday, 10:30AM–12AM, Thursday, 10:30AM–12AM, Friday, 10:30AM–02PM, Saturday, 10:30AM–12AM, Sunday, 10:30AM–12AM');

что ты уже испробовал? Что-либо?

demircioglu 29.03.2022 22:02
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
1
69
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

WITH days_of_week AS (
  SELECT * FROM (
    SELECT column1, ROW_NUMBER() OVER (ORDER BY1) AS row_number
    FROM VALUES
        ('Monday'), ('10:30AM–12AM'), ('Tuesday'), ('10:30AM–12AM'), ('Wednesday'), ('10:30AM–12AM'), ('Thursday'), ('10:30AM–12AM'), ('Friday'), ('10:30AM–12AM'), ('Saturday'), ('10:30AM–12AM'), ('Sunday'), ('10:30AM–12AM')
    )
  WHERE row_number % 2 = 1 ),
hours_open AS (
  SELECT * FROM(
    SELECT column1, ROW_NUMBER() OVER (ORDER BY1) AS row_number
    FROM VALUES
        ('Monday'), ('10:30AM–12AM'), ('Tuesday'), ('10:30AM–12AM'), ('Wednesday'), ('10:30AM–12AM'), ('Thursday'), ('10:30AM–12AM'), ('Friday'), ('10:30AM–12AM'), ('Saturday'), ('10:30AM–12AM'), ('Sunday'), ('10:30AM–12AM')
    )
  WHERE row_number % 2 = 0)
SELECT  d.column1 AS Day, h.column1 AS Schedule 
FROM days_of_week d
INNER JOIN hours_open h
ON d.row_number = h.row_number-1;

Спасибо за ответ, но прошу прощения за неполную информацию. Значения в столбце будут динамическими. Я добавил образец таблицы и записи в описание сейчас.

LazyDeveloper 30.03.2022 06:11
CREATE TABLE DEV.EDW.t1 (id NUMBER, VENDOR VARCHAR2, HOURS VARCHAR2);

INSERT INTO DEV.EDW.t1 (id, vendor, hours)
VALUES 
(1001, 'ABC', 'Monday, 07:00AM–12AM, Tuesday, 10:30AM–12AM, Wednesday, 10:30AM–12AM, Thursday, 10:30AM–12AM, Friday, 10:30AM–12AM, Saturday, 10:30AM–12AM, Sunday, 10:30AM–12AM'),
(1002, 'DEF', 'Monday, 08:00AM–01PM, Tuesday, 08:00AM–01PM, Wednesday, 08:00AM–01PM, Thursday, 08:00AM–01PM, Friday, 08:00AM–01PM, Saturday, 10:30AM–12AM, Sunday, 10:30AM–01PM'),
(1003, 'GHE', 'Monday, 09:00AM–02PM, Tuesday, 09:00AM–02PM, Wednesday, 09:00AM–02PM, Thursday, 09:00AM–02PM, Friday, 09:00AM–02PM, Saturday, 10:30AM–12AM, Sunday, 10:30AM–12AM'),
(1004, 'IJK', 'Monday, 10:00AM–03PM, Tuesday, 10:00AM–03PM, Wednesday, 10:00AM–03PM, Thursday, 10:00AM–03PM, Friday, 10:00AM–02PM, Saturday, 10:30AM–12AM, Sunday, 10:30AM–12AM'),
(1005, 'LMN', 'Monday, 10:30AM–04PM, Tuesday, 10:30AM–12AM, Wednesday, 10:30AM–12AM, Thursday, 10:30AM–12AM, Friday, 10:30AM–02PM, Saturday, 10:30AM–12AM, Sunday, 10:30AM–12AM');

SELECT * FROM DEV.EDW.t1;

SELECT Id,Vendor,DAY,SCHEDULE FROM (
Select  src.id,src.Vendor
       ,CASE WHEN Index%2=1 THEN VALUE END AS DAY
       ,LEAD(VALUE) OVER(PARTITION BY SEQ ORDER BY INDEX) AS SCHEDULE
From (SELECT ID,VENDOR,HOURS FROM DEV.EDW.t1 ) src, table(strtok_split_to_table(src.HOURS,','))
) out WHERE DAY IS NOT NULL
ORDER BY ID,Vendor
;

Спасибо за ответ, но прошу прощения за неполную информацию. Значения в столбце будут динамическими. Я добавил образец таблицы и записи в описание сейчас.

LazyDeveloper 30.03.2022 06:11

@LazyDeveloper Эй, я только что заменил ручной ввод табличным вводом и отлично работаю с динамическими значениями при условии, что шаблон (день, часы) остается прежним. Пожалуйста, проверьте. спасибо

Anshul Gupta 30.03.2022 15:57

Спасибо Аншул за помощь

LazyDeveloper 30.03.2022 19:40
Ответ принят как подходящий

Ах, забавно, настройте ввод так, чтобы у него была только одна запятая в день / час, затем разделите_в_таблицу, а затем разделите по настройке для быстрых побед, весело!

так что с вами отличные образцы данных превратились в CTE:

WITH cte_table_data as (
    SELECT * FROM VALUES 
        (1001, 'ABC', 'Monday, 07:00AM–12AM, Tuesday, 10:30AM–12AM, Wednesday, 10:30AM–12AM, Thursday, 10:30AM–12AM, Friday, 10:30AM–12AM, Saturday, 10:30AM–12AM, Sunday, 10:30AM–12AM'),
        (1002, 'DEF', 'Monday, 08:00AM–01PM, Tuesday, 08:00AM–01PM, Wednesday, 08:00AM–01PM, Thursday, 08:00AM–01PM, Friday, 08:00AM–01PM, Saturday, 10:30AM–12AM, Sunday, 10:30AM–01PM'),
        (1003, 'GHE', 'Monday, 09:00AM–02PM, Tuesday, 09:00AM–02PM, Wednesday, 09:00AM–02PM, Thursday, 09:00AM–02PM, Friday, 09:00AM–02PM, Saturday, 10:30AM–12AM, Sunday, 10:30AM–12AM'),
        (1004, 'IJK', 'Monday, 10:00AM–03PM, Tuesday, 10:00AM–03PM, Wednesday, 10:00AM–03PM, Thursday, 10:00AM–03PM, Friday, 10:00AM–02PM, Saturday, 10:30AM–12AM, Sunday, 10:30AM–12AM'),
        (1005, 'LMN', 'Monday, 10:30AM–04PM, Tuesday, 10:30AM–12AM, Wednesday, 10:30AM–12AM, Thursday, 10:30AM–12AM, Friday, 10:30AM–02PM, Saturday, 10:30AM–12AM, Sunday, 10:30AM–12AM')
    t(id, vendor, hours)
)

и этот SQL

select 
    c.id, 
    c.vendor,
    trim(split_part(v.value,'|',1)) as day,
    trim(split_part(v.value,'|',2)) as SCHEDULE
from cte_table_data as c
    ,table(split_to_table(replace(c.hours,'y,','y|'), ',')) v
order by v.seq, v.index;
Я БЫПРОДАВЕЦДЕНЬРАСПИСАНИЕ
1001азбукаПонедельник07:00–12:00
1001азбукаВторник10:30–12:00
1001азбукаСреда10:30–12:00
1001азбукаЧетверг10:30–12:00
1001азбукаПятница10:30–12:00
1001азбукаСуббота10:30–12:00
1001азбукаВоскресенье10:30–12:00
1002ДЭФПонедельник08:00–13:00
1002ДЭФВторник08:00–13:00
1002ДЭФСреда08:00–13:00
1002ДЭФЧетверг08:00–13:00
1002ДЭФПятница08:00–13:00
1002ДЭФСуббота10:30–12:00
1002ДЭФВоскресенье10:30–13:00
1003GHEПонедельник09:00–14:00
1003GHEВторник09:00–14:00
1003GHEСреда09:00–14:00
1003GHEЧетверг09:00–14:00
1003GHEПятница09:00–14:00
1003GHEСуббота10:30–12:00
1003GHEВоскресенье10:30–12:00
1004IJKПонедельник10:00–15:00
1004IJKВторник10:00–15:00
1004IJKСреда10:00–15:00
1004IJKЧетверг10:00–15:00
1004IJKПятница10:00–14:00
1004IJKСуббота10:30–12:00
1004IJKВоскресенье10:30–12:00
1005ЛМНПонедельник10:30–16:00
1005ЛМНВторник10:30–12:00
1005ЛМНСреда10:30–12:00
1005ЛМНЧетверг10:30–12:00
1005ЛМНПятница10:30–14:00
1005ЛМНСуббота10:30–12:00
1005ЛМНВоскресенье10:30–12:00

Спасибо Семен за помощь

LazyDeveloper 30.03.2022 19:41

Другие вопросы по теме