如何重新排列列的值
问题描述:
我有一个表(tblDates)。在这张表中我有两列(日期,年龄)。现在我想如果我在这个表中添加新的日期,那么Age列重新排列了那里的值。如何重新排列列的值
表 - tblDates
Date Age
--------------------
12/01/14 5
12/02/14 4
12/03/14 3
12/04/14 2
12/05/14 1
如果我添加了新日期即14年12月6日,然后我想造成这样的
表 - tblDates
Date Age
--------------------
12/01/14 6
12/02/14 5
12/03/14 4
12/04/14 3
12/05/14 2
12/06/14 1
答
拉出值是当您查询时,您不想插入数据。您似乎想要:
select d.*, row_number() over (order by date desc) as age
from tblDates d;
否则,您的插入操作将变得非常繁琐,需要更改表中的所有行。
答
我可能在阅读过多的问题,但如果您的目标是计算从给定日期(今天?)到存储在表格中的日期的年龄(以天为单位),那么您会更好使用DATEDIFF function并在每次查询时计算其值。
例如:
-- Option 1: Compute when you query it each time in the query you require it
SELECT d.[Date], DATEDIFF(dd, d.[Date], CONVERT(DATE, GETDATE())) as [Age]
FROM tblDates AS d
您也可以定义你的表作为计算列Age列,如果它会经常不够用,或包裹表在视图中嵌入这个计算:
-- Option 2: Compute at query time, but build the computation into the table definition
CREATE TABLE [dbo].[tblDates] (
[Date] DATE NOT NULL,
[AgeInDaysComputed] AS (DATEDIFF(dd, [Date], CONVERT(DATE, GETDATE())))
)
GO
-- Option 3: Compute at query time, but require caller interact with a different object
-- (view) to get the computation
CREATE VIEW [dbo].[vwDates]
AS
SELECT d.[Date], DATEDIFF(dd, d.[Date], CONVERT(DATE, GETDATE())) as [AgeInDays]
FROM dbo.tblDates AS D
GO
关于GETDATE函数的一个注意事项:您需要知道您的服务器时区,因为GETDATE根据您服务器的本地时区返回日期。只要你的服务器配置和用户的配置都在同一时区,这应该提供正确的结果。 (如果以天为单位的年龄是你想要计算的,你可能想要编辑你的问题以更好地反映这个意图,为未来的读者带来好处,因为它与“重新排列列的价值”有很大的不同“)
您需要更好地定义”年龄“是如何计算的。它是按照日期排序的简单的行编号吗?如果日期重复或缺失,该怎么办?另外为什么你需要存储这个值? – 2014-12-07 18:44:01
然后用desc对年龄进行聚集索引。为什么要使用SQL,TSQL,2008和2012.它不能是所有这些东西。 – Paparazzi 2014-12-07 18:46:57
RDBMS中行的顺序是不相关的。使用ORDER BY子句按特定顺序查看行。 – 2014-12-07 19:00:43