我有一张桌子,看起来像:
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
我的项目是为游客制作菲律宾锡基霍尔岛的地图应用程序,我希望该应用程序仅显示该岛。我能找到的唯一坐标是。我不知道如何实现这些坐标