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

如何为每个岛屿的连续记录编号?

路奇
2023-03-14
问题内容

我有一张桌子,看起来像:

group    date        color
  A      1-1-2019      R
  A      1-2-2019      Y
  B      1-1-2019      R
  B      1-2-2019      Y
  B      1-3-2019      Y
  B      1-4-2019      R
  B      1-5-2019      R
  B      1-6-2019      R

它是按组和日期排序的。我想要一个额外的列来显示每个组的 连续 颜色’R’的顺序号。

要求的输出:

group    date        color    rank
  A      1-1-2019      R      1
  A      1-2-2019      Y      null
  B      1-1-2019      R      1
  B      1-2-2019      Y      null
  B      1-3-2019      Y      null
  B      1-4-2019      R      1
  B      1-5-2019      R      2
  B      1-6-2019      R      3

我试图将窗口函数与按组和颜色列进行分区一起使用,但它返回的输出在下面是不正确的。

错误的查询和输出:

SELECT 
    *, 
    RANK() OVER (PARTITION BY group, color order by group, date) as rank
FROM table

group    date        color    rank
  A      1-1-2019      R      1
  A      1-2-2019      Y      null
  B      1-1-2019      R      1
  B      1-2-2019      Y      null
  B      1-3-2019      Y      null
  B      1-4-2019      R      2
  B      1-5-2019      R      3
  B      1-6-2019      R      4

我想知道它是否可以在SQL中使用,还是应该切换到另一种语言(例如Python)?


问题答案:

这是使用窗口功能可以完成的方式。首先,我们创建一个CTE,该CTE具有一个标志,指示新的序列已开始,然后从中生成一个对序列号进行计数的标志。最后,我们对每个序列中的行进行计数以获得排名:

WITH cte AS (SELECT `group`, date, color,
                    COALESCE(color = LAG(color) OVER(ORDER BY `group`, date), 0) AS samecolor
             FROM `table`),
sequences AS (SELECT `group`, date, color,
              SUM(samecolor = 0) OVER (ORDER BY `group`, date) AS seq_num
              FROM cte)
SELECT `group`, date, color,
       ROW_NUMBER() OVER (PARTITION BY seq_num) AS `rank`
FROM sequences
ORDER BY `group`, date

输出:

group   date        color   rank
A       1-1-2019    R       1
A       1-2-2019    Y       1
B       1-1-2019    R       1
B       1-2-2019    Y       1
B       1-3-2019    Y       2
B       1-4-2019    R       1
B       1-5-2019    R       2
B       1-6-2019    R       3

dbfiddle上的演示

请注意Y,如果您希望将值NULL替换rank为此的定义,则此查询还会给出值的排名:

CASE WHEN color = 'Y' THEN NULL
     ELSE ROW_NUMBER() OVER (PARTITION BY seq_num) 
     END AS `rank`


 类似资料:
  • 问题内容: 问题 我有一个s 数组。对于那些不熟悉此类的人,重要的信息是它们提供了功能。 我想编写一个函数,该函数采用s的此数组,并将其分解为一组连接的矩形。 比方说,例如,这些是我的矩形(构造函数采用的参数,,,): 快速绘图显示A与B相交,B与C相交。D没有相交。一件乏味的ascii艺术作品也可以完成这项工作: 因此,我的函数的输出应为: 失败的代码 这是我解决问题的尝试: 不幸的是,这里似乎

  • 问题内容: 我已经搜索了此内容,但是所有类似的问题和答案都完全不同,无法正常工作。 我有一个包含以下字段的表格:人,事物,purdate。当某人购买每件新东西时,将输入一条新记录。 我想计算一个人连续购买了“事物”(thing01或thing02,没有关系)的月份。如果连续的休息日休息,则应重新开始计数。 封闭数据后,我想得出以下结论: 我知道我可以得到一个不同的人员列表,extract(purd

  • 有一个大小为N x M的网格,有些单元是岛,用“0”表示,其他的是水。每个水电池上都有一个数字,表示在该电池上做桥的成本。你必须找到所有岛屿都能连接起来的最小成本。如果一个单元格共享一条边或一个顶点,则该单元格与另一个单元格相连。 用什么算法可以解决这个问题?如果N,M的值很小,比如说NxM<=100,那么用什么作为蛮力方法呢? 示例:在给定的图像中,绿色单元格表示岛屿,蓝色单元格表示水,浅蓝色单

  • 我有数据。下面的框架。我想添加一列“g”,它根据列中的连续序列对数据进行分类。也就是说,如最后一列“g”所示,h_no

  • 问题内容: 表名称调用 上面是一个示例,我需要找出的是如何找到连续无应答计数大于6的数字? 目前,我已经能够获得以下信息,但它不是连续的。 问题答案: 您可以使用变量来执行此操作。 该查询使用4个变量 1)@cur_outcome,它最初设置为空字符串。此后,选择将分配当前行的system_outcome。 2)@prev_outcome,最初设置为空字符串。此后,选择将其设置为@cur_outc

  • 我的项目是为游客制作菲律宾锡基霍尔岛的地图应用程序,我希望该应用程序仅显示该岛。我能找到的唯一坐标是。我不知道如何实现这些坐标