U-SQL在谓词中不支持BETWEEN的原因是没有适用于非Equijoin的横向扩展连接算法。即使我们在句法上允许它,它仍然会在计划中交叉连接。
您要做的是获得一个可以分区的连接。一种方法是在分区键上进行相等连接,然后在该分区内进行交叉连接。
然而,在你的情况下,我认为你真的不需要加入。我认为您要做的是在开始日期和结束日期之间每天生成一行。
我会用
CROSS APPLY EXPLODE
没有规模限制。以下是一个示例:
@MyTable =
SELECT *
FROM (VALUES
(81,81,(DateTime?) DateTime.Parse("2005-12-06 00:00:00.000"),(DateTime?) DateTime.Parse("2006-03-13 10:27:13.000")),
(82,82,(DateTime?) DateTime.Parse("2011-03-29 20:57:51.000"),(DateTime?) DateTime.Parse("2016-03-02 18:48:11.000")),
(83,83,(DateTime?) DateTime.Parse("2007-11-01 00:00:00.000"),(DateTime?) DateTime.Parse("2016-03-02 18:42:57.000")),
(84,84,(DateTime?) DateTime.Parse("2007-11-01 00:00:00.000"),(DateTime?) null),
(85,85,(DateTime?) DateTime.Parse("2007-11-01 00:00:00.000"),(DateTime?) DateTime.Parse("2013-09-12 09:19:05.000")),
(86,86,(DateTime?) DateTime.Parse("2011-02-28 00:00:00.000"),(DateTime?) null),
(87,87,(DateTime?) DateTime.Parse("2011-02-28 00:00:00.000"),(DateTime?) DateTime.Parse("2016-03-02 18:59:37.000")),
(88,88,(DateTime?) DateTime.Parse("2011-02-28 00:00:00.000"),(DateTime?) null),
(89,89,(DateTime?) DateTime.Parse("2008-01-17 00:00:00.000"),(DateTime?) null)
) AS T(SomeKey, SomeData, StartDate, EndDate);
@res =
SELECT SomeKey, SomeData, StartDate, EndDate, DailyDate
FROM @MyTable
CROSS APPLY EXPLODE
(Enumerable.Range(0,
1 + (EndDate == (DateTime?) null ? DateTime.Now
: EndDate.Value).Subtract(StartDate.Value).Days)
.Select(offset => StartDate.Value.AddDays(offset))
) AS T(DailyDate);
OUTPUT @res
TO "/output/test.csv"
USING Outputters.Csv(outputHeader : true);
这是一个典型的例子,说明基于问题场景而不是要求翻译更容易回答:)。