【问题标题】:SQL Server: get all previous values that are within half year of a month (not in future)?SQL Server:获取一个月半年内的所有先前值(不是将来)?
【发布时间】:2017-04-25 15:40:44
【问题描述】:

我有诸如

之类的价值观
201401
201411
201501
201504
201508
201606

如果我选择从 201501 开始持续六个月的值,我想得到 201411。如果从 201606 开始持续六个月,那么什么都没有。如果从 201508 开始,则从 201504 开始。

我有一个 varchar 形式的月份列 201601

如何使用某些数据类型对象(例如 datepart 函数)获取相对于每个月的最近六个月?

【问题讨论】:

  • 只是为了我们提高潜在答案和理解力,您是只需要一个结果还是返回多个结果? (如果您考虑所有可能性,最多可能返回 5 个值。)您的数据是否包含在表中或其他位置?它存储在什么类型中? (varchar、char、int?)
  • @Lostblue 所有可能的值,范围可以有很多值。如果从 201505 开始,那么您必须至少返回 201504 和 201501。

标签: sql sql-server tsql sql-server-2014


【解决方案1】:

另一个减少记录级别处理/转换的选项

Declare @YourTable table (SomeCol varchar(6))
Insert Into @YourTable values
(201401),
(201411),
(201501),
(201504),
(201508),
(201606)

Declare @Target varchar(6) = '201508'

Select *
 From  @YourTable
 Where SomeCol >= format(dateadd(MONTH,-6,cast(@Target+'01' as date)),'yyyyMM') 
   and SomeCol < @Target

返回

201504

【讨论】:

  • 赞成。但是,我不喜欢使用 Format() 函数,因为我发现它在用于数据字段时执行得非常糟糕。对于这种格式,我更喜欢使用 convert(char(6),DateField,112),因为它的性能要好得多。在您的回答中,您已将格式正确应用于变量而不是列,因此性能差异无关紧要,但我仍然建议您习惯于转换选项。
  • @WesH 是的格式不是很好,但在这种情况下它只解决一次
  • 我目前使用 partition 和 group-by 来计算过去 6 个月的不同比率。我弄错了一个间隔月,一个缺失的月份。这种方法将通过低效的子查询来解决它,因此是否可以在分区子句中以某种方式使用 where 条件:"SUM(..) OVER (PARTITION BY [OrderID] Order by [CMonth] ROWS BETWEEN 1 PRECEDING AND CURRENT ROW)" 我试图用这个特定月份的方法替换 PRECEDING AND CURRENT ROW 语句?还是向数据添加零行更好?
  • @hhh 有点偏离你原来的问题。也许如果您使用一些示例数据和所需结果编辑问题。但在我的脑海中,一个简单的左连接到所需日期表以“填补空白”
  • 感谢您的提示,我从问题here 转移了出发点。我的目标是计算不同窗口(3 个月、6 个月)的不同比率。我目前使用 GROUP-BY-ID-ORDER-BY-CMONTH-ROWS-directives 来过滤掉行,但是这种带有特定月份指令的方法可能会更好。如果您能对其进行概述,我将不胜感激,我正在尝试提供示例数据。
【解决方案2】:

这是一种方法:

where left(val, 4) * 12 + right(val, 2) >= left('201501', 4) * 12 + right('201501', 2) - 6

这是相当不雅的。基本上是将值转换为自日期以来的月份。

或者,您可以使用日期算术:

where cast(val + '01' as date) >= dateadd(month, -6, cast('201501' + '01' as date)

在这两种情况下,您都可以添加一个计算列,然后在计算列上添加一个索引,以使查询运行得更快。

【讨论】:

  • 后者也选择未来的值?你怎么能把未来的案件排除在外?
  • @hhh 。 . .您可以添加val &lt;= '201501'。这部分很简单。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-06
  • 2012-06-16
  • 2021-01-12
  • 1970-01-01
相关资源
最近更新 更多