Перекрестные таблицы в петле - PullRequest
1 голос
/ 06 мая 2019

У меня есть эти две таблицы

ItemMov

Item  Date
A     2018-03-31
A     2018-03-30
A     2018-03-25
B     2018-03-28
B     2018-03-29

и DateTable

Date
2018-03-31
2018-03-30
2018-03-29
2018-03-28
2018-03-27
2018-03-26
2018-03-25

Мне нужно, чтобы между этими двумя фигурами был какой-то перекрестный продукт, ноограничено самой ранней датой для каждого элемента.Первоначально я использовал простой перекрестный продукт.

select distinct t.Item, f.Date from ItemMov t cross join DateTable f

получая это

Item       Date
 A    2018-03-31
 A    2018-03-30
 A    2018-03-29
 A    2018-03-28
 A    2018-03-27
 A    2018-03-26
 A    2018-03-25
 B    2018-03-31
 B    2018-03-30
 B    2018-03-29
 B    2018-03-28
 B    2018-03-27
 B    2018-03-26
 B    2018-03-25

Конечно, это пересечение приносит даты раньше, чем первая дата для некоторых элементов, таких как B. Желаемый результат должен бытьчто-то подобное, но ограничено мин (дата) для каждого элемента.Итак, есть ли причина делать это с пересечением таблиц или использовать какой-то цикл?

Желаемый вывод

Item       Date
 A    2018-03-31
 A    2018-03-30
 A    2018-03-29
 A    2018-03-28
 A    2018-03-27
 A    2018-03-26
 A    2018-03-25
 B    2018-03-31
 B    2018-03-30
 B    2018-03-29
 B    2018-03-28

Ответы [ 2 ]

2 голосов
/ 06 мая 2019

Рассмотрим join с on выражением даты предложения:

select distinct t.Item, f.Date 
from ItemMov t 
inner join DateTable f on t.Date <= f.Date
-- cross join DateTable f on t.Date <= f.Date
order by t.Item, f.Date desc

Rextester demo

2 голосов
/ 06 мая 2019

Вы можете агрегировать перед выполнением join:

select i.item, d.date
from (select i.item, min(date) as min_date, max(date) as max_date
      from itemmov i
      group by i.item
     ) i join
     datetable d
     on d.date >= i.min_date and d.date <= i.max_date
order by i.item, d.date;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...