如何重新排列列的值

如何重新排列列的值

问题描述:

我有一个表(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 
+1

您需要更好地定义”年龄“是如何计算的。它是按照日期排序的简单的行编号吗?如果日期重复或缺失,该怎么办?另外为什么你需要存储这个值? – 2014-12-07 18:44:01

+0

然后用desc对年龄进行聚集索引。为什么要使用SQL,TSQL,2008和2012.它不能是所有这些东西。 – Paparazzi 2014-12-07 18:46:57

+0

RDBMS中行的顺序是不相关的。使用ORDER BY子句按特定顺序查看行。 – 2014-12-07 19:00:43

拉出值是当您查询时,您不想插入数据。您似乎想要:

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根据您服务器的本地时区返回日期。只要你的服务器配置和用户的配置都在同一时区,这应该提供正确的结果。 (如果以天为单位的年龄是你想要计算的,你可能想要编辑你的问题以更好地反映这个意图,为未来的读者带来好处,因为它与“重新排列列的价值”有很大的不同“)