![]() |
1
5
如果你的例子在第一行应该说70,那么 假设@range_start和@range_end作为条件参数:
使用 greatest /最小和 date functions 您应该能够直接在日期类型上获得所需的内容。 |
![]() |
2
1
恐怕你运气不好。 由于您不知道将要“累积相交”的行数,因此需要递归解决方案或聚合运算符。 您需要的聚合运算符不是选项,因为SQL没有它应该操作的数据类型(该类型是间隔类型,如“临时数据和关系模型”中所述)。 递归解决方案可能是可行的,但很可能难以编写,难以向其他程序员读取,而且优化器能否将该查询转换为最佳数据访问策略也值得怀疑。 或者我误解了你的问题。 |
![]() |
3
1
如果你知道最长的时间,有一个相当有趣的解决方案。创建一个包含所有数字的表,从一个到您的最大时间。
称之为时间维度(这种技术经常用于数据仓库中的维度建模。) 然后是:
…将给出1030到1100之间运行时间的总毫秒数。 当然,是否可以使用这种技术取决于您是否能够安全地预测数据中的最大毫秒数。 正如我所说,这通常用于数据仓库;它很好地适用于某些类型的问题——例如,我将其用于保险系统,在保险系统中需要两个日期之间的总天数,并且数据的总体日期范围很容易估计(从最早的客户数据开始出生日期到未来几年的某个日期,超过了任何正在出售的保单的结束日期。) 可能不适合你,但我觉得这是值得分享的一个有趣的技巧! |
![]() |
4
0
在您添加示例之后,很明显我误解了您的问题。 您不是“累积交叉行”。 为您提供解决方案的步骤包括: 将每一行的起点和终点与给定的起点和终点相交。这应该可以通过使用case表达式或类似性质的东西来实现,风格如下: 选择(case startdate<givenstartdate:givenstartdate,case startdate>=givenstartdate:startdate)作为retainedStartDate,(同样对于enddate),作为retainedEndDate,从…根据需要为空的东西和类似的东西提供食物。 对于retainedStartDate和retainedEndDate,使用日期函数计算保留间隔的长度(即行与给定时间段的重叠)。 选择其中的sum()。 |
![]() |
Community wiki · SQL语法新手 1 年前 |
|
KateMak · 是否将多行中的多列与唯一id组合? 1 年前 |
![]() |
Karuna · SQL中列内的筛选器[重复] 1 年前 |
![]() |
Irvan Affandy · 为另一个选择选择声明的键 1 年前 |
![]() |
Community wiki · 这个MySQL语句出了什么问题? 1 年前 |
![]() |
Community wiki · 优化从同一表中提取的多列的查询 1 年前 |