【问题标题】:SQL query with order by clause带有 order by 子句的 SQL 查询
【发布时间】:2019-09-19 07:42:29
【问题描述】:

我有一个有 3 列的表。产品、名称、时间戳。目前,我没有任何 rownumber 列。如果我从表中获取记录,我将使用

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

【问题讨论】:

  • 你使用的是什么数据库管理系统?
  • 有可能,但解决方案因您的数据库引擎而异。
  • 我使用的是 SQL server 14

标签: sql sql-server tsql


【解决方案1】:

'Transaction'是一对take + return。它的身份是从源数据计算出来的,因此OPERATORs 可以按照您需要的方式进行分组。对于未配对的OPERATORs 的数据,查询可能会失败。

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;

【讨论】:

  • 你真是太棒了!!!我认为它工作得很好。让我再检查一下。非常感谢您的支持。
【解决方案2】:

大多数 RDBMS 都有一个ROW_NUMBER() 窗口函数(一个值得注意的例外是 MySQL 8.0 之前的版本):

select 
    t.* ,
    row_number() over(order by Product ,Name, TimeStamp) rn
from table t
order by Product, Name, TimeStamp

【讨论】:

  • 对不起,我什么都没做。
  • 操作员产品用户名时间戳 1 INS1 1YHSG 2018-08-15 09:02:33.000 1 INS1 1YHSG 2018-08-15 10:46:17.000 2 INS1 1YHSG 2018-08-15 11: 01:28.000 2 INS1 1YHSG 2018-08-15 17:07:47.000 我有这样的数据。如果操作员为 1,则在相应的时间戳购买许可证。如果操作员为 2,则释放许可证。这里对于第 1 个许可证,第 3 行是发布时间,对于第 2 个购买的许可证,第 4 行是发布时间。我需要数据按第 1 行、第 3 行、第 2 行和第 4 行的顺序排列。请帮忙。
  • @Peak ,编辑问题添加您的解释。 SO 强烈建议不要将重要信息放入 cmets。
  • @serg,完成。请检查。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-27
  • 1970-01-01
  • 2011-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多