我有一个有 3 列的表。产品,名称,时间戳。目前,我没有任何行号列。如果我从表中获取记录,我将使用
select *
from table
order by Product,Name,TimeStamp.
我会得到一些数据顺序。按照这个顺序,我需要另一列应该显示行号。简而言之,我需要一列,该列应该根据查询的上述顺序告诉我行号。
是否可以根据某种顺序插入值? 在创建这样的表时?
OPERATOR PRODUCT USER NAME TIME STAMP
1 INS1 1YHS 2018-08-15 09:02:33.000
1 INS1 1YHS 2018-08-15 10:46:17.000
2 INS1 1YHS 2018-08-15 11:01:28.000
2 INS1 1YHS 2018-08-15 17:07:47.000
在这里,如果操作员为 1,则获取产品 INS1 的许可证,如果操作员为 2,则返回同一产品的许可证。同一个人可以获取更多许可证。第 1 行已获取许可证的详细信息,并返回了相同的许可证,该信息存储在第 3 行中。对于第 2 行,许可证返回的信息存储在第 4 行中。
我需要像这样显示表格
OPERATOR PRODUCT USER NAME TIME STAMP
1 INS1 1YHS 2018-08-15 09:02:33.000
2 INS1 1YHS 2018-08-15 11:01:28.000
1 INS1 1YHS 2018-08-15 10:46:17.000
2 INS1 1YHS 2018-08-15 17:07:47.000
'Transaction' 是一对 take + return。它的身份是从源数据计算出来的,因此OPERATOR
可以按照您需要的方式进行分组。查询可能会在具有未配对OPERATOR
的数据上失败。
declare @tbl table (
OPERATOR int,
PRODUCT varchar(50),
[USER NAME] varchar(100),
[TIME STAMP] datetime);
insert into @tbl(OPERATOR, PRODUCT, [USER NAME], [TIME STAMP]) values
(1, 'INS1', '1YHS', '2018-08-15 09:02:33.000')
,(1, 'INS1', '1YHS', '2018-08-15 10:46:17.000')
,(2, 'INS1', '1YHS', '2018-08-15 11:01:28.000')
,(2, 'INS1', '1YHS', '2018-08-15 17:07:47.000');
select OPERATOR, PRODUCT, [USER NAME], [TIME STAMP]
from (
select OPERATOR, PRODUCT, [USER NAME], [TIME STAMP]
, row_number() over(partition by PRODUCT, [USER NAME], OPERATOR order by [TIME STAMP]) transId
from @tbl) t
order by PRODUCT, [USER NAME], transId, OPERATOR;
大多数RDBMS都有一个ROW_NUMBER()
窗口函数(一个值得注意的例外是8.0版之前的MySQL(:
select
t.* ,
row_number() over(order by Product ,Name, TimeStamp) rn
from table t
order by Product, Name, TimeStamp