带order by子句的SQL查询

时间:2019-09-19 07:42:29

标签: sql sql-server tsql

我有一个包含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,则返回同一产品的许可证。同一个人可以获取更多许可证。第一行包含许可证的详细信息,并且返回了相同的许可证,该信息存储在第三行中。对于第二行,许可证返回的信息存储在第四行中。

我需要显示表格

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

2 个答案:

答案 0 :(得分:0)

大多数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

答案 1 :(得分:0)

“交易”是一对获利+回报。它的身份是根据源数据计算得出的,因此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;