【发布时间】:2013-09-03 18:52:35
【问题描述】:
假设我在 SQL Server 中有下表:
Date ColA ColB
1/1/2013 Val1A Val1B
1/1/2013 Val2A NULL
1/1/2013 Val3A Val3B
1/2/2013 Val1A NULL
1/2/2013 Val2A Val4B
而且,我希望看到 ColB 的每日变化 - 在这种情况下可能如下所示:
Date ColA ColB_Today ColB_Prev_Day
1/2/2013 Val1A NULL Val1B
1/2/2013 Val2A Val4B NULL
1/2/2013 Val3A NULL Val3B
因此,为此我创建了一个相当复杂的查询(将表连接到自身),它有一个输入变量和一个计算变量,如下所示:
DECLARE @Date Date = '1/2/2013', @PrevDay Date;
SET @PrevDay = (Select TOP 1 Date from MyTable where Date < @Date order BY Date desc);
SELECT
@Date as 'Date',
T1.ColA,
T1.ColB as ColB_Today,
T2.ColB as ColB_Prev_Day
FROM
(SELECT * FROM MyTable where Date = @Date) T1,
FULL OUTER JOIN
(SELECT * FROM MyTable where Date = @PrevDay) T2
ON
T1.ColA = T2.ColA
这是我要找的。p>
现在,我希望能够将其转换为视图(不传递任何参数),而不是这个参数化查询。
我希望我想做的事情是有意义的...换句话说,视图将包含 Date、ColA、ColB_Today 和 ColB_Prev_Day 列,它只是从中提取数据该表可以创建相同的结果而无需参数化日期(简单地说,基于表中可用的日期) - 我最大的挑战似乎是上面的 Val3A 行,它的值仅适用于 2 个日期之一,而不是两者都...
有什么想法吗???
谢谢!!
【问题讨论】:
-
您使用什么版本的 SQL Server?
-
首先,请停止使用
1/2/2013这样的模棱两可的格式。是1月2日还是2月1日?不要让我们、代码的其他维护者或 SQL Server 猜测。使用明确的格式,例如YYYYMMDD。 -
您会选择表格中的哪个日期来替换输入参数?
-
如果这是 SQL Server 2012,您可以使用 LAG 删除连接。
-
我正在使用 SQL Server 2008 和 @AaronBertrand,这不是我的表中的内容...这正是我用来编写示例的内容...我的表有很大的不同,而且要复杂得多。 ..这只是我的版本,以展示我希望以最简单的方式实现的目标....
标签: sql sql-server sql-server-2008 join sql-view