我正在尝试对一系列交易进行排名,但是我的源数据并不捕获每天可能发生多次的交易时间,我可以使用的唯一其他字段是timestamp
字段 - 这会被正确排名吗?
这是代码
SELECT [LT].[StockCode]
, [LT].[Warehouse]
, [LT].[Lot]
, [LT].[Bin]
, [LT].[TrnDate]
, [LT].[TrnQuantity]
, [LT].[TimeStamp]
, LotRanking = Rank() Over (Partition By [LT].[Warehouse],[LT].[StockCode],[LT].[Lot] Order By [LT].[TrnDate] Desc, [LT].[TimeStamp] Desc)
From [LotTransactions] [LT]
返回的结果如下
StockCode |Warehouse |Lot |Bin |TrnDate |TrnQuantity |TimeStamp |LotRanking
2090 |CB |3036 |CB |2016-02-16 00:00:00.000 |2.000000 |0x0000000000500AB9 |1
2090 |CB |3036 |CB |2016-02-16 00:00:00.000 |2.000000 |0x0000000000500A4E |2
答案 0 :(得分:3)
首先,您应该使用rowversion
而不是timestamp
来跟踪行版本控制信息。我相信timestamp
已被弃用。至少,文档明确建议[rowversion][1]
。
其次,我强烈建议您向表中添加标识列。这将提供您真正需要的信息 - 以及该表的一个很好的唯一键。
通常,timestamp
或rowversion
仅用于确定行是否已更改 - 而不是确定排序。但是,根据这个描述,你正在做的可能是正确的:
每个数据库都有一个计数器,该计数器针对每个插入或递增 在包含a的表上执行的更新操作 数据库中的timestamp列。这个计数器是数据库 时间戳。这会跟踪数据库中的相对时间,而不是数据库 可以与时钟关联的实际时间。一张桌子只能有 一个时间戳列。每次带有timestamp列的行 修改或插入后,递增的数据库时间戳值为 插入时间戳列。
我要提醒一点,这可能不安全。相反,它给出了这种方法可能有意义的原因。让我重复一下建议:添加一个标识列,这样您就可以正确添加此信息,至少在将来是这样。
答案 1 :(得分:2)
你可以使用这样的东西获得交易的datetime
:
SELECT LEFT(CONVERT(nvarchar(50),[LT].[TrnDate],121),10) + RIGHT(CONVERT(nvarchar(50),CAST([LT].[TimeStamp] as datetime),121),13)
对于第一个字符串,它将是:
2016-02-16 04:51:25.417
并将其用于排名。