【发布时间】:2016-08-11 19:52:55
【问题描述】:
我有一个表,其中一些值存储了数月和数年。
例子:
Month | Year | Value
1 | 2013 | 1.86
2 | 2013 | 2.25
3 | 2013 | 2.31
...
3 | 2016 | 1.55
4 | 2016 | 1.78
月份和年份组合是一个复杂的主键。保证表中存在过去所有年份的所有值。
用户可以选择特定月份和特定年份。假设用户选择 2014 作为年份和 6 作为月份,我需要显示所选组合之前的 15 行和之后的 15 行。
但是如果在选择的组合之后没有足够的行(少于 15 行),那么我需要在之前获得更多的行。
基本上我只需要返回 31 行(除非整个表中没有足够的行,否则总是 31)数据,其中所选组合将尽可能靠近中心。
这样做的正确方法是什么?
目前我被这个困住了:
;WITH R(N) AS
(
SELECT 0
UNION ALL
SELECT N+1
FROM R
WHERE N < 29
)
SELECT * FROM MyTable e
LEFT OUTER JOIN (
SELECT N, MONTH(DATEADD(MONTH,-N,iif(@year != Year(GETDATE()), DATEFROMPARTS(@year, 12, 31) ,GETDATE()))) AS [Month],
YEAR(DATEADD(MONTH,-N,iif(@year!= Year(GETDATE()), DATEFROMPARTS(@year, 12, 31) ,GETDATE()))) AS [Year]
FROM R) s
ON s.[Year] = e.[Year] AND s.[Month] = e.[Month]
WHERE s.[N] is not null
这不是我真正想做的,因为它只是切断了明年的几个月
【问题讨论】:
-
什么 sql server 版本?
-
@dfundako 更新了问题
-
我的第一个 SWAG 将是从表中获取 MIN 和 MAX 日期(带有索引的快速。)并考虑到边缘情况计算要返回的适当日期。然后针对相应的行运行查询。
标签: sql-server tsql sql-server-2012 common-table-expression