当前位置: 首页 > 面试题库 >

ROW_NUMBER个查询

许昆
2023-03-14
问题内容

我有一张桌子:

Trip  Stop  Time 
-----------------
1     A     1:10
1     B     1:16
1     B     1:20
1     B     1:25
1     C     1:31
1     B     1:40
2     A     2:10
2     B     2:17
2     C     2:20
2     B     2:25

我想在我的查询输出中增加一列:

Trip  Stop  Time Sequence
-------------------------
1     A     1:10   1
1     B     1:16   2 
1     B     1:20   2
1     B     1:25   2
1     C     1:31   3
1     B     1:40   4 
2     A     2:10   1
2     B     2:17   2
2     C     2:20   3
2     B     2:25   4

困难的部分是B,如果B彼此相邻,我希望它具有相同的顺序,如果不是,则视为新行。

我知道

row_number over (partition by trip order by time)
row_number over (partition by trip, stop order by time)

他们都不符合我想要的条件。有没有办法查询这个?


问题答案:
create table test
(trip number
,stp  varchar2(1)
,tm   varchar2(10)
,seq  number);

insert into test values (1,     'A',     '1:10',   1);
insert into test values (1,     'B',     '1:16',   2); 
insert into test values (1,     'B',     '1:20',   2);
insert into test values (1 ,    'B',     '1:25',   2);
insert into test values (1 ,    'C',     '1:31',   3);
insert into test values (1,     'B',     '1:40',   4);
insert into test values (2,     'A',     '2:10',   1);
insert into test values (2,     'B',     '2:17',   2);
insert into test values (2,     'C',     '2:20',   3);
insert into test values (2,     'B',     '2:25',   4);

select t1.*
      ,sum(decode(t1.stp,t1.prev_stp,0,1)) over (partition by trip order by tm) new_seq
from  
     (select t.*
            ,lag(stp) over (order by t.tm) prev_stp
      from   test t
      order  by tm) t1
;

  TRIP S TM                SEQ P    NEW_SEQ
------ - ---------- ---------- - ----------
     1 A 1:10                1            1
     1 B 1:16                2 A          2
     1 B 1:20                2 B          2
     1 B 1:25                2 B          2
     1 C 1:31                3 B          3
     1 B 1:40                4 C          4
     2 A 2:10                1 B          1
     2 B 2:17                2 A          2
     2 C 2:20                3 B          3
     2 B 2:25                4 C          4

 10 rows selected

您想查看停靠点是否在一行和下一行之间改变。如果是这样,您要增加序列。因此,请使用lag将上一个停靠点移至当前行。

我之所以使用DECODE是因为它处理NULL的方式,并且比CASE更为简洁,但是如果您正在阅读教科书,则可能应该使用CASE。

将SUM用作带有ORDER BY子句的解析函数将提供您要寻找的答案。



 类似资料:
  • 问题内容: 我的SQL代码有什么问题? 我试图消除此答案之后的重复行 但是我一直收到以下错误: 在“(”附近:语法错误:SELECT rn = ROW_NUMBER()OVER( 这是SQL代码: 我在某处读到它与SQL版本或sqlite3的用法有关? 这里是一些其他有关该问题的信息: 我有一张开始的桌子: 我想最后得到一个没有关于col_2和col_3的复数的表(不关心col_1和col_4是什

  • 问题内容: MySQL中有没有复制SQL Server函数的好方法? 例如: 然后,例如,我可以添加一个条件以将限制限制为1,以获得每对最高的一行。 问题答案: 我想要每对(col1,col2)对具有最高col3的行。 这是一个按组的最大值,是最常提出的SQL问题之一(因为它看起来应该很容易,但实际上并非如此)。 我经常为null-self-join充实: “获取表中没有匹配col1,col2的其

  • 本文向大家介绍SQL Server中row_number分页查询的用法详解,包括了SQL Server中row_number分页查询的用法详解的使用技巧和注意事项,需要的朋友参考一下 ROW_NUMBER()函数将针对SELECT语句返回的每一行,从1开始编号,赋予其连续的编号。在查询时应用了一个排序标准后,只有通过编号才能够保证其顺序是一致的,当使用ROW_NUMBER函数时,也需要专门一列用于

  • 问题内容: 首先,我想提一下,我已经检查了所有其他问题,没有一个与我的相似,所以我认为这不是重复的。 我有两个表表,到目前为止,“ Article_tbl”具有超过300,000行,而“ ArticleZone_tbl”具有几乎相同的行数。 “ Article_tbl”包含一个身份主键“ ArticleID”。“ ArticleZone_tbl”包含一个主键,该主键由三列组成:“ ArticleI

  • 问题内容: 我正在使用Microsoft SQL Server Management Studio 2008。 我有看起来像这样的数据: 我希望结果显示如下: 这些列是未知的,所以我知道我需要一个动态查询。我已经尝试过使用数据透视功能进行动态查询,但只在相同类型的值下进行分组。所以聚合函数对我不利。 这是我尝试过的查询: 执行(@DynamicPivotQuery) 接下来,我添加了row_num

  • 问题内容: 我有一个页面,它执行一个自定义查询,该查询已保存在数据库中的某个位置。我需要能够在gridview上启用分页。 例如,查询保存在数据库中的方式如下: 这将返回10,000行。 使用下面的方法,我使它返回10行。 这是绑定网格的代码 问题在于查询本身返回10行,因此gridview将永远不会显示寻呼机。 问题答案: 此代码在aspx页面 在此,将在.cs页中使用的方法。该方法用于跟踪pa