【问题标题】:SQL Server : advanced computed column formulaSQL Server:高级计算列公式
【发布时间】:2016-04-23 20:34:50
【问题描述】:

SQL 表有一个 NVARCHAR(MAX) 类型的列,其中包含客户状态的历史记录。

StatusHistory 列中的值示例:

20120401P,20140715A,20160118T

意思:

  • 2012 年 4 月 1 日,客户处于待处理状态
  • 2015 年 7 月 15 日,客户开始活跃
  • 2016 年 1 月 18 日,客户被终止

状态将始终按时间升序排列!

在同一张表中,我有一个名为CustStatus 的列,我想通过读取上面基于GETDATE()StatusHistory 列来存储当前客户状态。

目前我正在使用CustStatus 中的一个公式执行此操作,该公式使用用户定义的函数。

我可能错了,但我认为如果我可以在不使用用户定义函数的情况下做到这一点,我可以提高包括这些信息在内的查询的性能。

那么,是否有一个公式可以让我根据GETDATE() 读取StatusHistory 来填充CustStatus

【问题讨论】:

  • 这是一个非常糟糕的设计! 不要再浪费时间尝试处理这个问题了 - 你需要修复你的设计!。您应该有一个具有当前状态的Customer 表,以及一个引用Customer 表并包含日期和状态列的单独CustomerHistory 表。有了这样一个适当的关系设置,查询将变得轻而易举!!
  • 如果我的问题是“设计好不好?”,为什么我总是得到答案。。不是我问的!所以我想没有人知道该怎么做。
  • @FrankM.,因为回答你的实际问题会鼓励你继续使用它:)

标签: sql sql-server calculated-columns


【解决方案1】:

设计很糟糕。但是,根据您的规范假设您没有未来状态,您可以非常简单地获得最新状态:

select right(StatusHistory, 1) as CurrentStatus

我非常同意 marc_s 的观点,即您应该修复设计并拥有一个 CustomerStatusHistory 表来正确存储这些。但是,如果您无法修复数据结构,至少这可以帮助您获得所需的信息。

注意:使用right() 通常会比用户定义的函数快得多。

【讨论】:

  • 感谢您到目前为止的回复。首先,字符串可能会收到未来的状态。另外,我确实有一个单独的状态表,并且我试图找到一个替代方法,以避免每次需要检索给定日期的状态时都读取该表。如果我打印一个已过日期的报告,我希望该报告反映该日期的状态,如果我今天打印相同的报告或发布日期相同。
  • 当然必须有更好的方法来做到这一点,同时提高我的查询性能。接受任何建议。
猜你喜欢
  • 1970-01-01
  • 2011-05-04
  • 1970-01-01
  • 2018-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多