SQL 挑战/难题:给定堆栈跟踪 - 如何找到每个时间点的顶部元素?

2023-12-03

  • 我现实生活中的用例是合并嵌套范围。 我画了一些草图,然后我看到了堆栈 PUSH 和 POP 操作的开始和结束范围之间的相似之处。我明白解决了这个问题也就解决了原来的问题。

  • The op实际上可以从问题中删除列。当 val 为 NULL 时,则为 POP 操作,否则为 PUSH 操作。

谜题

一张桌子,堆栈跟踪,包含以下列:

  • i - 表示时间点的整数值。
  • op - 2 种可能的操作:I(“输入”/“推”)和O(“出”/“弹出”)。
  • val - 由“in”/“push”操作插入的值或“out”/“pop”操作插入的值。

    目标是找出每个时间点堆栈顶部的值是多少(i).

e.g.

(NULL 值在这里表示为空格)

data:

i   op  val 
--  --  --  
1   I   A   
2   I   B   
3   O
4   I   C
5   O    
6   O   

所需结果:

i   top_of_stack_val
--  ----------------
1   A
2   B
3   A
4   C
5   A
6   

要求

  • 解决方案应该是单个 SQL 查询(子查询就可以)。
  • 仅允许使用以下子句:SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY.
  • 指某东西的用途WITH子句(CTE - 通用表表达式)不允许.
  • T-SQL、PL/SQL等的使用不允许.
  • UDF(用户定义函数)的使用不允许.
  • 变量的使用不允许.

样本数据

create table stack_trace
(
    i       int
   ,op      char(1)
   ,val     char(1)
)
;

insert into stack_trace (i,op,val) values (1,'I','A');
insert into stack_trace (i,op,val) values (2,'I','B');
insert into stack_trace (i,op,val) values (3,'I','C');
insert into stack_trace (i,op,val) values (4,'I','D');
insert into stack_trace (i,op,val) values (5,'I','E');
insert into stack_trace (i,op)     values (6,'O');
insert into stack_trace (i,op)     values (7,'O');
insert into stack_trace (i,op)     values (8,'O');
insert into stack_trace (i,op,val) values (9,'I','F');
insert into stack_trace (i,op)     values (10,'O');
insert into stack_trace (i,op,val) values (11,'I','G');
insert into stack_trace (i,op,val) values (12,'I','H');
insert into stack_trace (i,op)     values (13,'O');
insert into stack_trace (i,op)     values (14,'O');
insert into stack_trace (i,op,val) values (15,'I','I');
insert into stack_trace (i,op,val) values (16,'I','J');
insert into stack_trace (i,op,val) values (17,'I','K');
insert into stack_trace (i,op,val) values (18,'I','L');
insert into stack_trace (i,op,val) values (19,'I','M');
insert into stack_trace (i,op)     values (20,'O');
insert into stack_trace (i,op,val) values (21,'I','N');
insert into stack_trace (i,op)     values (22,'O');
insert into stack_trace (i,op,val) values (23,'I','O');
insert into stack_trace (i,op)     values (24,'O');
insert into stack_trace (i,op,val) values (25,'I','P');
insert into stack_trace (i,op)     values (26,'O');
insert into stack_trace (i,op)     values (27,'O');
insert into stack_trace (i,op,val) values (28,'I','Q');
insert into stack_trace (i,op,val) values (29,'I','R');
insert into stack_trace (i,op)     values (30,'O');
insert into stack_trace (i,op)     values (31,'O');
insert into stack_trace (i,op)     values (32,'O');
insert into stack_trace (i,op)     values (33,'O');
insert into stack_trace (i,op)     values (34,'O');
insert into stack_trace (i,op)     values (35,'O');
insert into stack_trace (i,op,val) values (36,'I','S');
insert into stack_trace (i,op)     values (37,'O');
insert into stack_trace (i,op)     values (38,'O');
insert into stack_trace (i,op,val) values (39,'I','T');
insert into stack_trace (i,op,val) values (40,'I','U');
insert into stack_trace (i,op)     values (41,'O');
insert into stack_trace (i,op,val) values (42,'I','V');
insert into stack_trace (i,op,val) values (43,'I','W');
insert into stack_trace (i,op,val) values (44,'I','X');
insert into stack_trace (i,op)     values (45,'O');
insert into stack_trace (i,op)     values (46,'O');
insert into stack_trace (i,op,val) values (47,'I','Y');
insert into stack_trace (i,op)     values (48,'O');
insert into stack_trace (i,op)     values (49,'O');
insert into stack_trace (i,op,val) values (50,'I','Z');
insert into stack_trace (i,op)     values (51,'O');
insert into stack_trace (i,op)     values (52,'O');

所需结果

i   top_of_stack_val
--  ----------------
1   A
2   B
3   C
4   D
5   E
6   D
7   C
8   B
9   F
10  B
11  G
12  H
13  G
14  B
15  I
16  J
17  K
18  L
19  M
20  L
21  N
22  L
23  O
24  L
25  P
26  L
27  K
28  Q
29  R
30  Q
31  K
32  J
33  I
34  B
35  A
36  S
37  A
38  
39  T
40  U
41  T
42  V
43  W
44  X
45  W
46  V
47  Y
48  V
49  T
50  Z
51  T
52  

这是一个很好的谜题。

由于我的主要 DBMS 是 Teradata,我使用分析函数为其编写了一个解决方案(需要 TD14.10+):

SELECT dt.*,
   -- find the last item in the stack with the same position
   Last_Value(val IGNORE NULLS)
   Over (PARTITION BY pos
         ORDER BY i) AS top_of_stack_val
FROM 
 ( 
   SELECT st.*,
      -- calculate the number of items in the stack
      Sum(CASE WHEN op = 'I' THEN 1 ELSE -1 end) 
      Over (ORDER BY i
            ROWS Unbounded Preceding) AS pos
   FROM stack_trace AS st
 ) AS dt;

该解决方案也适用于 Oracle,但 PostgreSQL 和 SQL Server 不支持IGNORE NULLS选项LAST_VALUE并且模拟它非常复杂,例如参见 Itzk Ben-Gan 的最后一个非 NULL 谜题

编辑:事实上,它并没有那么复杂,我忘记了 Itzik 的第二个解决方案,旧的背驮技巧;-)

Martin Smith 的方法适用于所有四种 DBMS。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL 挑战/难题:给定堆栈跟踪 - 如何找到每个时间点的顶部元素? 的相关文章

  • 将记录与另一个表上的最新记录连接

    我正在尝试创建一个 SQL 视图 我如何从一个表中选择最新的记录 而其他记录保持原样 我需要从所有表中选择所有记录 这工作正常 但我需要仅按日期选择最新的提案 这是我遇到的问题 这是我到目前为止所拥有的 SELECT TOP 100 PER
  • ssis将N个表从源服务器加载到目标服务器的最佳实践

    我需要将 N 个 大约 50 个 表从源数据库加载到目标数据库 每个表都与其他表不同 因此元数据不同 我想我可以使用父 pkg 来调用子 pkg 其中每个子 pkg 都有简单的结构 例如 DFT 来映射要导入的表 1 个子 pkg gt 1
  • 在数据库中有效存储商品位置(用于订购)

    设想 有一个用户拥有的电影数据库 电影显示在一个名为 我的电影 的页面上 电影可以按照用户想要的顺序显示 例如 位置 1 为 搏击俱乐部 位置 3 为 Drive 依此类推 显而易见的解决方案是存储每个项目的位置 例如 电影 ID 用户 I
  • Redis 与 SQL Server 性能对比

    应用程序性能是使用缓存而不是关系数据库的主要原因之一 因为它以键值对的形式将数据存储在内存中 所以我们可以将经常访问的不经常更改的数据存储在缓存中 从缓存中读取比从数据库中读取要快得多 Redis 是分布式缓存市场上最好的解决方案之一 我正
  • mssql 的 UUID 疯狂

    我的数据库条目有一个 UUID 及其值 使用 Microsoft SQL Server Management Studio 提取 CDF86F27 AFF4 2E47 BABB 2F46B079E98B 将其加载到我的 Scala 应用程序
  • PDO 和 Microsoft SQL:必须声明表变量“@P1”

    我正在尝试使用 PDO 中的绑定从 Microsoft SQL 数据库中选择一些条目 我正在使用的代码看起来与我在文档中找到的代码类似 但是 当我运行它时 我收到以下警告 警告 PDOStatement execute pdostateme
  • 如何使用 pgAdmin 恢复 postgreSQL 转储文件?

    我有一个 dmp 文件 想要从中恢复数据库 使用 pgAdmin 我该怎么做 在 PgAdmin3 内 在您正在使用的服务器中创建一个新数据库 右键单击该数据库并选择 恢复 使用 浏览器 按钮选择 dmp 文件 选择 恢复 开始恢复数据库
  • 在 JSP 中迭代列表对象

    我正在做一个项目来尝试自学 spring 和 struts 我目前卡在 JSP 页面上 我有一个 pojo 类 其中包含带有 getter setter 的变量 eid 和 ename 我还有一个 sql 中的表 其具有相同的值和六个填充行
  • 从 Visual Studio 调试 SQL Server 2005 中的存储过程?

    我在这里和其他地方看到很多令人沮丧的问题 但没有明确的答案 我试图让存储过程进行调试 但没有成功 客户端 VS2005或VS2008 两者都不起作用 当我从存储过程上下文菜单中选择 步入存储过程 时 我在调试窗口中看到 已被用户取消 这就是
  • 删除 Sql 服务器中最后一次出现特殊字符之前的子字符串

    我想删除最后一次出现句点之前的子字符串 查询应该转换r k Lee Brown to Lee Brown 所以 基本上我需要最后一个点之前的子字符串 并将其替换为 尝试这个 SELECT RIGHT str CHARINDEX REVERS
  • SQL Server 中不需要的日期时间舍入

    我遇到了一些看起来很奇怪的事情 SQL Server 似乎正在舍入一些DateTime当我将它们保存到时 值不合适datetime列 我怀疑我错过了一些东西 但我找不到它 我正在使用 NET 4 0 针对 SQL Server 2008 运
  • 将 SQL 中的数据存储在数组中

    我正在尝试将 sql 数据库中的数据存储到数组中 目前我有这个 query mysql query SELECT FROM InspEmail WHERE Company LIKE company while row mysql fetch
  • 如何从表中选择层次结构中的最低级别

    我有一个具有父 子关系的表 Table A Column Id int Column Parent Id int Column Description text 一组示例数据如下 999 NULL Corp 998 999 Div1 997
  • 删除 SQL Server 上的所有扩展属性

    如何以可编写脚本的方式删除 SQL Server 上的所有扩展属性 如果您想要一个能够一次性删除所有扩展属性的脚本 请使用 Jamie Thomson 创建的脚本 该脚本将为所有扩展属性生成删除 您可以从这里下载article http s
  • 通用 Oracle 数据收集存储

    我正在设计一个新的实验室数据库 我想将所有测试的原始结果存储在一起 在某些情况下 结果是单个值 然而 结果有时是原始波形或信号 下面哪种情况是理想的 以及为什么 或提供您自己的理想选择 选项 1 将每个单独的数据点存储为单独的结果行 距 t
  • SQL COUNT(*) 返回错误答案

    以下脚本应返回部门名称以及这些部门中的员工人数 营销 行政和销售部门有 0 名员工 但返回值不是 0 而是 1 我怎样才能纠正它 select Department Departments DepartmentID count as Num
  • 如何在 SQL 中编写 where 子句来按一天中的时间过滤 DATETIME 列?

    我有带有 DATETIME 列时间戳的数据 我想将其过滤到 DATETIME 介于上午 9 30 到下午 5 30 之间的任意一天的记录集 最好的方法是什么 更新 更改是因为我需要精确到分钟 而不仅仅是小时 对于那个很抱歉 您始终可以将其编
  • 在带有循环引用的表中插入 SQL

    我有 2 张桌子 Empleados numEmpl nombre apellido sexo telefono salario numDept Departamentos numDept nombreDept numDirect 在部门中
  • 获取SQL中前2个特殊字符之间的字符

    我有数据在sql 只是要注意 SQL STudio is the IDE like data a 10 b c a 1 b c 我想获取前两个符号之间的数据 Output 10 1 这就是我的方法 SELECT CAST
  • 计算行数并仅获取表中的最后一行

    我有一张桌子叫employeexam其结构和数据是这样的 id course id employee id degree date 1 1 3 8 2013 01 14 2 2 4 15 2013 01 14 3 2 4 17 2013 0

随机推荐

  • 在 Python multiprocessing.Pool 中共享可变全局变量

    我正在尝试更新共享对象 dict 使用以下代码 但这不起作用 它给了我输入dict作为输出 Edit Exxentially 我在这里想要实现的是将数据 列表 中的项目附加到字典的列表中 数据项给出字典中的索引 预期产出 2 2 1 1 4
  • MAMP PRO 崩溃; MySQL 不会在重启时启动

    今天上班时 我的电脑突然死机 崩溃了 重新启动时 MAMP 拒绝启动 mysql 我不明白为什么 肯定没有其他mysql进程在运行 我已经检查过好几次了 所以killall 9 mysqld不是解决方案 实际上我也完全重新安装了 MAMP
  • twitter4j 未发现身份验证挑战

    几天来一直尝试使用 twitter4j 发布推文 但没有运气 我想做的是让一个人在一轮结束时从应用程序的时间轴上发布他们的新最高分 这是我的代码 Override protected void onCreate Bundle savedIn
  • pandas.read_parquet 错误地解释了日期字段

    我有一个镶木地板文件 其中有一个日期字段 名为 BusinessDate 当我将其导入数据框时 它会自动确定字段 BusinessDate 是日期 datetime64 ns UTC 然而 由于这种格式 BusinessDate 场是 YY
  • 有没有办法在textview中显示HTML内容?

    我尝试了 iPhone Cookbook 中的以下一项 我通过访问 UITextview 的私有 API 显示 HTML 内容 例如 interface UITextView extended void setContentToHTMLSt
  • 用 python 抓取表格

    我正在尝试抓取表格并将其转换为 python 中的 data tables 但我在美国的选举数据方面运气不佳 这是我想要抓取的数据的 html tr class type republican th class results name a
  • 拆分字符串并将区域设置应用于 Pandas Series 的每一行

    我想对amount以下 df 的列 Address type amount 0 0x88aDa02f6fCE2F1A833cd9B4999D62a7ebb70367 outflow 250 000 VSO 1 0x88aDa02f6fCE2
  • 在nextjs中查看页面源不显示页面

    由于 SEO 我将项目从 CRA 转移到了 nextjs 在服务器端渲染时 客户端会获得完整的 HTML 页面作为响应 但在我的情况下 当我查看登陆页面的页面源时 我只会看到 div div div div 在每个页面上 页面源显示相同 这
  • 对 vtable 的未定义引用...

    我正在尝试编写一个 Http 代理 其工作原理基本上如下印度网络代理 所以我启动了 qtcreator 但我的一个类无法编译并出现臭名昭著的错误 undefined reference to vtable for HttpProxyThre
  • 查找一组日期范围中的空白的好方法是什么?

    查找一组日期范围中的空白的方法是什么 例如 我有这些日期范围 1 1 11 1 10 11 1 13 11 1 15 11 1 20 11 1 30 11 然后我的开始日期和结束日期分别为 2011 年 1 月 7 日和 2011 年 1
  • Android 相机2 API。设置多个 ImageReader 表面会产生空白输出

    我有一个camera2实现 当前的设置是 它使用纹理视图表面来显示实际的相机视图和ImageReader用于捕捉图像的表面 现在我也想捕获预览帧 所以我尝试添加一个新的ImageReader用于捕获帧的表面 但是当我将该表面添加到creat
  • ActionBar 中 SearchView 的主题

    我有一个SearchView in an ActionBar This SearchView图标是黑色的 文本也是黑色的 而我的图标是白色的 menu menu
  • 如何检测 Chrome 扩展程序中的网络状态变化

    我正在编写一个简单的 Chrome 扩展 需要该行为来检测设备是否连接到互联网 我目前正在尝试连接到 ping 服务来检查网络状态 但效率不高 我可以从 Chrome JavaScript API 监听任何事件吗 中没有具体事件Chrome
  • 写入操作期间发生磁盘错误。 (HRESULT 异常:0x8003001D (STG_E_WRITEFAULT))

    我正在使用 EPPlus 读取 vb net 中的 csv 文件 当我运行此代码时 出现错误 写入操作期间发生磁盘错误 HRESULT 异常 0x8003001D STG E WRITEFAULT 这是我的代码 Public Functio
  • 尝试让 QProcess 使用队列

    我正在尝试使用队列运行多个进程 并使用以下命令获取所有进程的输出QProcess但我有几个问题 我正在使用一个QSpinBox设置同时运行的最大进程数 我可以让主线程中的一切正常工作 或者如果我使用进程中的进程运行循环QObject但我无法
  • XML 规范是否定义在自闭斜杠之前有空格是非法的?

    我说的是 XML 文档而不是 HTML 由于在 HTML 中 br and br 都是有效的 想知道 XML 规范是否定义了自闭斜杠之前是否允许有空格 我刚刚遇到一个奇怪的问题
  • ModuleNotFoundError:没有名为“Crypto.Math”的模块

    在 Windows 上 我想运行pyinstaller myapp py w f但我对加密模块有一些错误 在我的代码中 我使用 4 个导入 这 4 个导入中的每一个 独立 都会给我同样的错误 from googleapiclient dis
  • 将属性文件添加到 IntelliJ 的类路径

    我正在使用 运行 gt 运行 菜单从 IntelliJ IDE 运行一个简单的 Java 程序 效果很好 现在我想添加 log4j 日志记录 我在项目根目录下添加了一个资源文件夹 我在该文件夹中添加了一个 log4j properties
  • angularjs 单击按钮显示下一个/上一个 div

    我有一堆用 ng repeat 创建的 Div Plunker 快速图片 是否可以像滑块一样创建这堆 div 工作 喜欢 如果我按 下一步 按钮 顶部 div 将滑开 并显示第二个顶部 按 上一个 按钮将显示上一个 div 如果有 Code
  • SQL 挑战/难题:给定堆栈跟踪 - 如何找到每个时间点的顶部元素?

    我现实生活中的用例是合并嵌套范围 我画了一些草图 然后我看到了堆栈 PUSH 和 POP 操作的开始和结束范围之间的相似之处 我明白解决了这个问题也就解决了原来的问题 The op实际上可以从问题中删除列 当 val 为 NULL 时 则为