【发布时间】:2019-05-06 14:01:18
【问题描述】:
我有这两张桌子
项目移动
Item Date
A 2018-03-31
A 2018-03-30
A 2018-03-25
B 2018-03-28
B 2018-03-29
和日期表
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,这种交叉会导致日期早于第一次约会。 所需的输出应该是这样的,但仅限于每个项目的 min(date)。那么,是否有为什么要使用交叉表执行此操作,还是应该使用某种循环?
期望的输出
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
【问题讨论】:
-
DISTINCT不是一个函数,它是SELECT DISTINCT的一部分,适用于整个选定的行。删除那些额外的括号以使代码更清晰,即只需执行select distinct t.Item, f.Date ...。 -
我不明白您达到预期输出的逻辑。你能解释得更好吗?
-
@TimBiegeleisen 这个想法是每个 Item 都会有日期从 DateTable 中的第一个日期开始的行,但限制了 ItemMov 表中的最早日期。
-
看你喜不喜欢
SELECT i.Item, d.Date FROM DateTable d LEFT JOINItemMov i USING(Date)`