带有 order by 子句的 SQL 查询

Posted

技术标签:

【中文标题】带有 order by 子句的 SQL 查询【英文标题】:SQL query with order by clause 【发布时间】: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 【参考方案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,完成。请检查。

以上是关于带有 order by 子句的 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

SQL语句中,为啥where子句不能使用列别名,而order by却可以?

我可以在 SQL 中使用 UNION 子句的查询中添加 ORDER BY 子句吗?

带有“Order Each by”子句的 Google BigQuery 大表(105M 记录)产生“资源超出查询执行”错误

带有 UNION 子句的 ORDER BY

子查询中不允许用order by子句,那么应该怎么办?

1. 安装Oracle,配置环境 2. 实现查询From子句 3. 实现查询where子句 4. 实现查询order by子句