Таблица с 2 датами Я хочу один список уникальных дат - PullRequest
0 голосов
/ 25 октября 2019

Скажем, например, у меня есть таблица с датой начала и конца даты

Item 1 10/2/2019 12/2/2019
Item 2 10/2/2019 15/2/2019.

Я хочу получить результат

Item 1 10/2/2019
Item 2 12/2/2019
Item 3 15/2/2019

В одном столбце, который я могу использовать длядальнейшие запросы

Не могу придумать, как получить желаемый результат

См. выше

Ответы [ 2 ]

2 голосов
/ 25 октября 2019

Вот что вы просили, если используете Oracle:

select 'Item ' || ROW_NUMBER() OVER(
        ORDER BY date_row
    ) row_num
    , date_row 
from (
select start_date as Date_row from table1
union
select end_date as Date_row from table1);

А вот DEMO

Вот что вы просили, если выиспользование MySQL:

select concat("Item ", ROW_NUMBER() OVER(ORDER BY date_row)) as Item
       ,  date_row 
from (
   select start_date as Date_row from table1 as t1 
   union
   select end_date as Date_row from table1 as t2
) as test;

А вот DEMO

Вот что вы просили, если используете Postgres:

select 'Item ' || ROW_NUMBER() OVER(
        ORDER BY date_row
    ) row_num
    , date_row 
from (
select start_date as Date_row from table1 as t1
union
select end_date as Date_row from table1 as t2) as t3;

А вот и ДЕМО

1 голос
/ 25 октября 2019

Вероятно, это:

SELECT 'startdate' as datekind, startdate 
FROM table
UNION
SELECT 'enddate', enddate 
FROM table

Тип является необязательным, но я добавил его, чтобы продемонстрировать, как вы будете знать, была ли дата началом или концом. Вы можете добавить другие столбцы, такие как ID, таким же образом

Если вы не хотите разбивать дубликаты, добавьте слово ALL после UNION

ПРИМЕЧАНИЕ. - Наличие столбца вида повлияет надата считается дубликатом другой строки или нет. Этот запрос может по-прежнему давать повторяющиеся даты, если один является началом, а другой - концом. Если это недопустимо, удалите столбец с датой (и примите, что вы не будете знать, что это такое)

Если мы создаем уникальный список дат и самый низкий связанный элемент:

SELECT x.d, min(x.item) as i 
FROM(
  SELECT startdate as d, item FROM table
  UNION ALL
  SELECT enddate, item FROM table
) x
GROUP BY x.d
...