1
4
我首先构建一个数字表,其中包含从1到100万左右的顺序整数。一旦你掌握了窍门,它们就会派上用场。 例如,下面是如何获取2008年每个月的1号:
现在,您可以使用OUTER APPLY将其组合在一起,以查找每个日期的最新交易,如下所示:
这应该会给你你想要的,但是你可能需要搜索一下,以找到创建数字表的最佳方法。 |
2
1
|
3
1
要以基于集合的方式执行此操作,您需要为所有数据或信息设置集合。在本例中,有一个被忽略的数据“有几个月?”在数据库中有一个“日历”表和一个“数字”表作为实用程序表是非常有用的。 这里有一个使用这些方法之一的解决方案。第一段代码用于设置日历表。您可以使用光标或手动或其他方式填充,也可以将其限制在业务所需的任何日期范围内(追溯到1900-01-01,或追溯到1970-01-01,以及您希望的未来)。您还可以添加对您的业务有用的任何其他列。
现在,使用此表,您的问题变得无关紧要:
|
4
1
约翰·吉布(John Gibb)给出了一个很好的答案,已经被接受了,但我想进一步说明:
这个微小的变化使用了 recursive common table expression 建立一组日期,表示DateRange中定义的开始日期和结束日期当天或之后每个月的第一个日期。注意使用MAXRECURSION选项来防止堆栈溢出(!);根据需要进行调整,以适应预期的最大月数。另外,考虑添加替代日期汇编逻辑来支持周、季甚至每天。
|
5
1
如果您经常进行这种类型的分析,您可能会对我为实现此目的而编写的SQL Server函数感兴趣:
这就是答案 question ,它也有一些示例输出。 |
6
1
我无法通过手机访问BOL,所以这是一个粗略的指南。。。 首先,您需要为没有数据的月份生成缺少的行。您可以使用固定表或临时表的外部联接(具有所需的时间跨度),也可以从编程创建的数据集(存储过程或类似的数据集)进行联接 其次,您应该查看新的SQL2008“分析”函数,如MAX(value)OVER(partition子句),以获取以前的值。 (我知道Oracle可以做到这一点,因为我需要它来计算交易日期之间的复利计算——真的是同样的问题) 希望这能为你指明正确的方向。。。 (避免把它扔进临时表,并在上面大骂。太粗糙了!!!) |
7
0
-----替代方法------
|
Community wiki · SQL语法新手 1 年前 |
KateMak · 是否将多行中的多列与唯一id组合? 1 年前 |
Karuna · SQL中列内的筛选器[重复] 1 年前 |
Irvan Affandy · 为另一个选择选择声明的键 1 年前 |
Community wiki · 这个MySQL语句出了什么问题? 1 年前 |
Community wiki · 优化从同一表中提取的多列的查询 1 年前 |