Sql 按状态划分行

Sql 按状态划分行,sql,google-bigquery,Sql,Google Bigquery,我有一个查询,它通过状态分区获取结果作为秩。但我需要下面给出的结果 COUNTERID status transaction_time RANK 121 NEW Nov-09-2019 8:32:19 1 121 NEW Nov-09-2019 8:32:19 2 121 CLAIMED Nov-09-2019 8:32:21 1 121 CLAIMED Nov-09-2019 8:32:21 2 121 NEW Nov-09-2019 8:32:59 1 121 CLAIMED N

我有一个查询,它通过状态分区获取结果作为秩。但我需要下面给出的结果

COUNTERID   status  transaction_time    RANK
121 NEW Nov-09-2019 8:32:19 1
121 NEW Nov-09-2019 8:32:19 2
121 CLAIMED Nov-09-2019 8:32:21 1
121 CLAIMED Nov-09-2019 8:32:21 2
121 NEW Nov-09-2019 8:32:59 1
121 CLAIMED Nov-09-2019 8:32:59 2
121 RESOLVED    Nov-09-2019 8:33:30 1
121 RESOLVED    Nov-09-2019 8:49:58 2
121 RESOLVED    Nov-13-2019 6:51:11 3
222 NEW Nov-11-2019 22:15:52    1
222 NEW Nov-11-2019 22:15:54    2
222 RESOLVED    Nov-11-2019 22:15:54    1
222 NEW Nov-11-2019 22:15:55    1
222 CLAIMED Nov-11-2019 22:16:24    1
222 CLAIMED Nov-11-2019 22:16:24    2
222 RESOLVED    Nov-11-2019 22:16:56    1
222 CLAIMED Nov-11-2019 22:33:06    1
222 RESOLVED    Nov-12-2019 7:39:00 1
222 RESOLVED    Nov-12-2019 23:59:45    2



SELECT COUNTERID, status, transaction_time, ROW_number()
                OVER (
                  partition by COUNTERID, status
                  order by COUNTERID, transaction_time
                ) AS RANK
FROM COUNTER_HISTORY
请帮我得到想要的结果。提前谢谢。
使用标准SQL这是一个缺口和孤岛问题。行号的差异应符合您想要识别组的要求:

select ch.* except (seqnum, seqnum_s),
       row_number() over (partition by counter_id, status, (seqnum_s - seqnum)
                          order by transaction_time
                         ) as ranking
from (select ch.*,
             row_number() over (partition by counter_id order by transaction_time) as seqnum,
             row_number() over (partition by counter_id, status order by transaction_time) as seqnum_s
      from counter_history ch
     ) ch;

解释为什么行号的差异标识具有相同值的相邻行有点麻烦。但是,如果您查看子查询的结果,您应该会看到它是如何工作的。

这是一个缺口和孤岛问题。行号的差异应符合您想要识别组的要求:

select ch.* except (seqnum, seqnum_s),
       row_number() over (partition by counter_id, status, (seqnum_s - seqnum)
                          order by transaction_time
                         ) as ranking
from (select ch.*,
             row_number() over (partition by counter_id order by transaction_time) as seqnum,
             row_number() over (partition by counter_id, status order by transaction_time) as seqnum_s
      from counter_history ch
     ) ch;

解释为什么行号的差异标识具有相同值的相邻行有点麻烦。但是,如果您查看子查询的结果,您应该会看到它是如何工作的。

谢谢gordon,我还有一个列源要在排名中考虑。尝试过。但没有运气。选择ch.*除了seqnum、seqnum、按计数器id分区的行号、状态、源、seqnum-seqnum按事务时间排序,从选择ch.*开始,按计数器id分区的行号、按事务时间的状态顺序,作为seqnum,按计数器id、状态、按事务时间划分的分区上的行数,如计数器历史记录中的seqnum@syncdm2012。你的问题没有提到一个叫做source的专栏。如果您无法调整此查询,我建议您提出一个新问题,并提供适当的数据和解释。谢谢。这是参考资料,谢谢戈登,我还有一个专栏资料要在排名中考虑。尝试过。但没有运气。选择ch.*除了seqnum、seqnum、按计数器id分区的行号、状态、源、seqnum-seqnum按事务时间排序,从选择ch.*开始,按计数器id分区的行号、按事务时间的状态顺序,作为seqnum,按计数器id、状态、按事务时间划分的分区上的行数,如计数器历史记录中的seqnum@syncdm2012。你的问题没有提到一个叫做source的专栏。如果您无法调整此查询,我建议您提出一个新问题,并提供适当的数据和解释。谢谢。这是参考资料