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

最高连续出现次数之和

能烨华
2023-03-14
问题内容

我有一个包含三列(lending_id int, installment_n serial int, status text)的表,我想知道如何WAITING_PAYMENT (status) 为每个lending_id检索最大的差距 。

对于以下示例:

lending_id | installment_n | status
71737   1    PAID
71737   2    PAID
71737   3    PAID
71737   4    PAID
71737   5    PAID
71737   6    WAITING_PAYMENT
71737   7    WAITING_PAYMENT
71737   8    WAITING_PAYMENT
71737   9    WAITING_PAYMENT
71737   10   WAITING_PAYMENT
71737   11   WAITING_PAYMENT
71737   12   WAITING_PAYMENT
71737   13   WAITING_PAYMENT
71737   14   WAITING_PAYMENT
71737   15   WAITING_PAYMENT
71737   16   WAITING_PAYMENT
71737   17   WAITING_PAYMENT
71737   18   WAITING_PAYMENT
71737   19   WAITING_PAYMENT
71737   20   WAITING_PAYMENT
71737   21   WAITING_PAYMENT
354226  1    PAID
354226  2    PAID
354226  3    WAITING_PAYMENT
354226  4    WAITING_PAYMENT
354226  5    WAITING_PAYMENT
354226  6    WAITING_PAYMENT
354226  7    PAID
354226  8    WAITING_PAYMENT
354226  9    WAITING_PAYMENT
354226  10   WAITING_PAYMENT
354226  11   WAITING_PAYMENT
354226  12   WAITING_PAYMENT
354226  13   WAITING_PAYMENT
354226  14   WAITING_PAYMENT
354226  15   WAITING_PAYMENT

我想知道如何检索:

lending_id | count
71737      | 16
354226     | 8

因为对于71737,它将考虑从装置6到21(16),对于354226,将考虑8和15(8)之间的间隙。


问题答案:

这是一种基于模仿的方法row_number(),适用于不支持窗口功能的MySQL版本(计划将窗口功能包含在MySQL v8.x中)。

这种方法的结果将揭示有关最长序列的更多事实,而不仅仅是计数本身。有关详细信息,请参见下面的结果。

SQL小提琴

MySQL 5.6模式设置

CREATE TABLE Table1
    (`lending_id` int, `installment_n` int, `status` varchar(15))
;

INSERT INTO Table1
    (`lending_id`, `installment_n`, `status`)
VALUES
    (71737, 1, 'PAID'),
    (71737, 2, 'PAID'),
    (71737, 3, 'PAID'),
    (71737, 4, 'PAID'),
    (71737, 5, 'PAID'),
    (71737, 6, 'WAITING_PAYMENT'),
    (71737, 7, 'WAITING_PAYMENT'),
    (71737, 8, 'WAITING_PAYMENT'),
    (71737, 9, 'WAITING_PAYMENT'),
    (71737, 10, 'WAITING_PAYMENT'),
    (71737, 11, 'WAITING_PAYMENT'),
    (71737, 12, 'WAITING_PAYMENT'),
    (71737, 13, 'WAITING_PAYMENT'),
    (71737, 14, 'WAITING_PAYMENT'),
    (71737, 15, 'WAITING_PAYMENT'),
    (71737, 16, 'WAITING_PAYMENT'),
    (71737, 17, 'WAITING_PAYMENT'),
    (71737, 18, 'WAITING_PAYMENT'),
    (71737, 19, 'WAITING_PAYMENT'),
    (71737, 20, 'WAITING_PAYMENT'),
    (71737, 21, 'WAITING_PAYMENT'),
    (354226, 1, 'PAID'),
    (354226, 2, 'PAID'),
    (354226, 3, 'WAITING_PAYMENT'),
    (354226, 4, 'WAITING_PAYMENT'),
    (354226, 5, 'WAITING_PAYMENT'),
    (354226, 6, 'WAITING_PAYMENT'),
    (354226, 7, 'PAID'),
    (354226, 8, 'WAITING_PAYMENT'),
    (354226, 9, 'WAITING_PAYMENT'),
    (354226, 10, 'WAITING_PAYMENT'),
    (354226, 11, 'WAITING_PAYMENT'),
    (354226, 12, 'WAITING_PAYMENT'),
    (354226, 13, 'WAITING_PAYMENT'),
    (354226, 14, 'WAITING_PAYMENT'),
    (354226, 15, 'WAITING_PAYMENT')
;

查询1

select lending_id, status, start_at_inst, end_at_inst, inst_count
from (
      select IF(@prev_value=lending_id, @rn:=@rn+1 , @rn:=1) AS rn
            , lending_id, status, start_at_inst, end_at_inst, inst_count
            , @prev_value := lending_id z
      from (
           select lending_id
                   , status
                   , grpby
                   , min(installment_n) start_at_inst
                   , max(installment_n) end_at_inst
                   , (max(installment_n) + 1) - min(installment_n) inst_count
            from (
                 select
                        IF(@prev_value=concat_ws(',',lending_id,status), @rn:=@rn+1 , @rn:=1) AS rn
                      , t.*
                      , installment_n - @rn grpby
                      , @prev_value := concat_ws(',',lending_id,status) z
                 from Table1 t
                 cross join (
                     select @rn := 0 , @prev_value := ''
                     ) vars
                 order by lending_id, status,installment_n ASC
                 ) d1
            group by lending_id, status, grpby
          ) d2
      cross join (
          select @rn := 0 , @prev_value := ''
          ) vars
      order by lending_id, inst_count DESC
     ) d3
where rn = 1

结果

| lending_id |          status | start_at_inst | end_at_inst | inst_count |
|------------|-----------------|---------------|-------------|------------|
|     354226 | WAITING_PAYMENT |             8 |          15 |          8 |
|      71737 | WAITING_PAYMENT |             6 |          21 |         16 |

在MySQL的V8.x正式发布之前,您不能使用row_number()。但是对于已经支持db的用户,以及对于可用的MySQL用户,这是使用row_number()的相同方法,我希望它比@variable方法更有效。

select
       lending_id, status, start_at_inst, end_at_inst, inst_count
from (
select 
       lending_id
       , status
       , grpby
       , min(installment_n) start_at_inst
       , max(installment_n) end_at_inst
       , (max(installment_n) + 1) - min(installment_n) inst_count
       , row_number() over(partition by lending_id order by (max(installment_n) + 1) - min(installment_n) DESC) rn
from (
     select
            t.*
          , installment_n - row_number() over(partition by lending_id, status order by installment_n) grpby
     from Table1 t
     ) d1
group by
       lending_id, status, grpby
    ) d2
where rn = 1
;

结果:

 lending_id | status          | start_at_inst | end_at_inst | inst_count
 ---------: | :-------------- | ------------: | ----------: | ---------:
      71737 | WAITING_PAYMENT |             6 |          21 |         16
     354226 | WAITING_PAYMENT |             8 |          15 |          8

dbfiddle(mariadb_10.2)
在这里



 类似资料:
  • 本文向大家介绍JavaScript实现列出数组中最长的连续数,包括了JavaScript实现列出数组中最长的连续数的使用技巧和注意事项,需要的朋友参考一下 原始题目: 给定一个无序的整数序列, 找最长的连续数字序列。 例如: 给定[100, 4, 200, 1, 3, 2], 最长的连续数字序列是[1, 2, 3, 4]。 小菜给出的解法:   调用说明:      方法名称:         

  • 问题内容: 我有这样的df: 如果两个或两个以上连续出现in和a如果没有连续出现,我想在新列中返回a 。因此,在新列中,每一行都将基于该列中满足的此条件获得一个。我想要的输出将是: 我想我可能需要使用,但是我一直在阅读,还没有发现我需要的东西。我希望能够使用此方法来计数任意数量的连续出现,而不仅仅是2。例如,有时我需要计算10次连续出现,在这里的示例中我只使用2次。 问题答案: 你可以: 要得到:

  • 本文向大家介绍JavaScript实现计算字符串中出现次数最多的字符和出现的次数,包括了JavaScript实现计算字符串中出现次数最多的字符和出现的次数的使用技巧和注意事项,需要的朋友参考一下 “计算出字符串中出现次数最多的字符是什么,出现了多少次?” 看到这个需求,我想大多数人应该首先想到的是转换成数组,再做处理,当然是可以解决问题的,然后这里提供一个巧妙的算法设计,无需转数组,可以很快解决问

  • 我正在用Verilog设计一个类似MIPS的CPU,现在我正在处理数据危险。我有以下指示: 问题是,当ADD指令到达阶段3(ALU应计算r1 r2)时,指令1(第二个LW)处于阶段4,尚未读取内存的r0 101地址,因此我应该暂停一个周期,然后Ins1到达最后一个阶段。 在这种情况下,第一个LW已经完成了它的工作,并且r1的新值不在dataPath中的任何位置,但我需要将此值传递给ALU的Inpu

  • 我有一个数据帧: 而我的目标是找到最长的连续增长期。它应该返回:老实说,我不知道从哪里开始。这些是我在熊猫的第一步,我不知道我应该使用哪些工具来获得这些信息。 有谁能帮我/给我指明正确的方向吗?

  • 问题内容: 假设我在numpy数组中有一堆数字,并且根据返回布尔数组的条件对它们进行了测试: 并使用此布尔数组,我想计算True连续出现的所有长度。例如,如果我有,我想回去。 我可以使用以下代码来做到这一点: 但是是否已经为此或python,numpy,scipy等函数实现了任何功能,该函数计算给定输入在列表或数组中连续出现的长度? 问题答案: 这是使用的解决方案(可能不是最快的解决方案):