Oracle SQL - 识别顺序值范围

2023-12-12

这是我的桌子:

ID  Name      Department
1   Michael   Marketing
2   Alex      Marketing
3   Tom       Marketing
4   John      Sales
5   Brad      Marketing
6   Leo       Marketing
7   Kevin     Production

我正在努力寻找ID范围在哪里Department = 'Marketing':

Range   From   To
Range1  1      3    
Range2  5      6

任何帮助,将不胜感激。


这很容易通过一种称为塔比比托桑.

该技术的作用是将每个组的行的位置与整个行集进行比较,以确定同一组中的行是否彼此相邻。

例如,对于您的示例数据,这看起来像:

WITH your_table AS (SELECT 1 ID, 'Michael' NAME, 'Marketing' department FROM dual UNION ALL
                    SELECT 2 ID, 'Alex' NAME, 'Marketing' department FROM dual UNION ALL
                    SELECT 3 ID, 'Tom' NAME, 'Marketing' department FROM dual UNION ALL
                    SELECT 4 ID, 'John' NAME, 'Sales' department FROM dual UNION ALL
                    SELECT 5 ID, 'Brad' NAME, 'Marketing' department FROM dual UNION ALL
                    SELECT 6 ID, 'Leo' NAME, 'Marketing' department FROM dual UNION ALL
                    SELECT 7 ID, 'Kevin' NAME, 'Production' department FROM dual)
-- end of mimicking your table with data in it. See the SQL below:
SELECT ID,
       NAME,
       department,
       row_number() OVER (ORDER BY ID) overall_rn,
       row_number() OVER (PARTITION BY department ORDER BY ID) department_rn,
       row_number() OVER (ORDER BY ID) - row_number() OVER (PARTITION BY department ORDER BY ID) grp
FROM   your_table;

        ID NAME    DEPARTMENT OVERALL_RN DEPARTMENT_RN        GRP
---------- ------- ---------- ---------- ------------- ----------
         1 Michael Marketing           1             1          0
         2 Alex    Marketing           2             2          0
         3 Tom     Marketing           3             3          0
         4 John    Sales               4             1          3
         5 Brad    Marketing           5             4          1
         6 Leo     Marketing           6             5          1
         7 Kevin   Production          7             1          6

在这里,我为整个数据集中的所有行提供了按 id 升序排列的行号(overall_rn列),并且我为每个部门中的行指定了行号(department_rn列),再次按 id 升序排列。

现在我已经做到了这一点,我们可以从另一个中减去一个(grp柱子)。

请注意,对于彼此相邻的部门行,组列中的数字如何保持相同,但每次出现间隙时它都会发生变化。

例如。对于营销部门,第 1-3 行彼此相邻,并且 grp = 0,但营销第 4 行实际上位于整个结果集的第 5 行,因此它现在具有不同的 grp 编号。由于第 5 行营销位于整个集合的第 6 行,因此它与第 4 行营销具有相同的 grp 编号,因此我们知道它们彼此相邻。

一旦我们有了 grp 信息,就可以对部门和新的 grp 列进行聚合查询分组,使用 min 和 max 来查找开始和结束 id:

WITH your_table AS (SELECT 1 ID, 'Michael' NAME, 'Marketing' department FROM dual UNION ALL
                    SELECT 2 ID, 'Alex' NAME, 'Marketing' department FROM dual UNION ALL
                    SELECT 3 ID, 'Tom' NAME, 'Marketing' department FROM dual UNION ALL
                    SELECT 4 ID, 'John' NAME, 'Sales' department FROM dual UNION ALL
                    SELECT 5 ID, 'Brad' NAME, 'Marketing' department FROM dual UNION ALL
                    SELECT 6 ID, 'Leo' NAME, 'Marketing' department FROM dual UNION ALL
                    SELECT 7 ID, 'Kevin' NAME, 'Production' department FROM dual)
-- end of mimicking your table with data in it. See the SQL below:
SELECT department,
       MIN(ID) start_id,
       MAX(ID) end_id
FROM   (SELECT ID,
               NAME,
               department,
               row_number() OVER (ORDER BY ID) - row_number() OVER (PARTITION BY department ORDER BY ID) grp
        FROM   your_table)
GROUP BY department, grp;

DEPARTMENT   START_ID     END_ID
---------- ---------- ----------
Marketing           1          3
Marketing           5          6
Sales               4          4
Production          7          7

注意,我假设 id 列中的间隙并不重要(即,如果没有 id = 6 的行(因此 Leo 和 Kevin 的 id 分别为 7 和 8),那么 Leo 和 Brad 仍会出现在同一列中组,起始 id = 5,结束 id = 7。

如果 id 列中的间隙算作指示新组,那么您可以仅使用 id 来标记整个行集(即无需计算overall_rn;只需使用 id 列即可)。

这意味着您的查询将变为:

WITH your_table AS (SELECT 1 ID, 'Michael' NAME, 'Marketing' department FROM dual UNION ALL
                    SELECT 2 ID, 'Alex' NAME, 'Marketing' department FROM dual UNION ALL
                    SELECT 3 ID, 'Tom' NAME, 'Marketing' department FROM dual UNION ALL
                    SELECT 4 ID, 'John' NAME, 'Sales' department FROM dual UNION ALL
                    SELECT 5 ID, 'Brad' NAME, 'Marketing' department FROM dual UNION ALL
                    SELECT 7 ID, 'Leo' NAME, 'Marketing' department FROM dual UNION ALL
                    SELECT 8 ID, 'Kevin' NAME, 'Production' department FROM dual)
-- end of mimicking your table with data in it. See the SQL below:
SELECT department,
       MIN(ID) start_id,
       MAX(ID) end_id
FROM   (SELECT ID,
               NAME,
               department,
               ID - row_number() OVER (PARTITION BY department ORDER BY ID) grp
        FROM   your_table)
GROUP BY department, grp;

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

Oracle SQL - 识别顺序值范围 的相关文章

  • COALESCE - 保证短路吗?

    From 这个问题 https stackoverflow com questions 505747 best way to do nested case statement logic in sql server 关于使用 COALESC
  • 如何处理 AWS Redshift unload 命令中的带引号的值?

    假设 遵循AWS docs https docs aws amazon com redshift latest dg r UNLOAD command examples html我想使用像这样的卸载命令 unload SELECT FROM
  • 按第一个字符分组

    我在 Oracle SQL 中的查询遇到问题 我有一个first name列中的employees桌子 我想根据中的第一个字符对记录进行分组first name 例如 我有 26 条记录 其中一条记录name Alice 一与name Bo
  • MySQL:在一条语句上连接多个表

    我有以下数据库结构 层次结构 TABLE 产品类别 id name TABLE product id parent id name 父 ID 是产品类型 ID TABLE treeNode id parent id name type 它是
  • 非数字列中的 SQL MAX 函数

    据我了解 MAX 函数 它应返回给定列的最大值 对于数值 例如工资列 对我来说很清楚 这是我在教程中找到的唯一应用程序 但是 我无法理解它在非数字列的情况下如何工作 我的问题源于这个练习 在 sql ex ru 上 找出只生产同类型型号的制
  • 原则 2 使用 LIKE 进行查询

    我有这个查询代码 repository em gt getRepository AcmeCrawlerBundle Trainings query repository gt createQueryBuilder p gt where p
  • SQL 中的 Snowflake 脚本 - 如何迭代 SHOW 命令的结果?

    我正在查看新的 SQL Snowflake 脚本 预览版 但我不知道如何迭代SHOW命令 特别是当某些列是小写时 https docs snowflake com en developer guide snowflake scripting
  • 使用 Union 或 Join - 哪个更快 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我只是想知道你是否有一张桌子并且联合起来会比使用联接更有效吗 我确实知道联接创建了更多列 但这更具理论性 联合是否需要像联接那样对另一
  • “django.core.exceptions.ValidationError”错误

    我正在 Django 中编写一个简单的游戏 所有的事情都是正确的 但是突然 我遇到了以下错误 Django v 1 7 Python v 3 4 我不知道这些代码有什么问题 test alireza alireza test test1 p
  • MySQL 将所有空格替换为 -

    我怎样才能删除一行中的所有空格 我在这里看到很多相同的问题 但所有答案都使用替换选项 替换只能去除一个空格 而不是全部 例如 a b c 变为 a b c Thanks 这可以通过以下 MySQL 函数来实现 SELECT REPLACE
  • 有没有办法刷新 Oracle 中 PL/SQL 的输出?

    我有一个从 shell 脚本中调用的 SQL 脚本 需要很长时间才能运行 目前它包含dbms output put line不同点的声明 这些打印语句的输出会出现在日志文件中 但仅在脚本完成后才会出现 有什么方法可以确保脚本运行时输出出现在
  • Python 和 SQLite:插入表

    具有以下表架构 tablename name varchar 100 age int sex char 1 有一个list有 3 行 每行代表一个表行 row1 laks 444 M row2 kam 445 M row3 kam 445
  • knex.where容易受到sql注入攻击吗?

    这是一个后续问题https stackoverflow com a 50337990 1370984 https stackoverflow com a 50337990 1370984 它提到knex table where descri
  • 编写 MySQL 查询以获得所需结果

    我正在使用 MySQL 数据库 风险因素有四种类型 严重 高 中 低 表包含如下数据 id uaid attribute value time risk factor 1 1234 Edge Exist 16123 NONE 2 1234
  • 在 CodeIgniter、SQL 中调用布尔值的成员函数 result()

    我试图根据搜索关键字查看 data results 中有哪些数据 但每次都会出现上述致命错误 有人可以帮助我吗 我的控制器 public function execute search search term this gt input g
  • 如何加载大量字符串与oracle数据库匹配?

    我目前正在学习 PL SQL 所以我还是一个新手 假设您有一个生产数据库 并使用 Oracle SQL Developer 连接到该数据库 您对该数据库仅有读取权限 因此您无法创建或编辑任何表 我的问题是 如果我有一个很大的 ID 列表 我
  • 如何在 SQL 中将 varchar 列拆分为多个值?

    我有这个 SQL Select 语句 SELECT AD Ref List Value FROM AD Ref List WHERE AD Ref List AD Reference ID 1000448 这是 SELECT 的结果 为了限
  • sp_MSforeachtable 在每个表上执行过程

    我想打印一些动态查询来对数据库中的所有表执行过程 这是我到目前为止所写的 EXEC SP MSFOREACHTABLE IF EXISTS SELECT FROM INFORMATION SCHEMA COLUMNS WHERE COLUM
  • Oracle 中的 if(条件, then, else)

    MySQL MSSQL 有一个简洁的小内联 if 函数 您可以在查询中使用它来检测空值 如下所示 SELECT foo a field AS a field SELECT if foo bar is null 0 foo bar AS ba
  • 使用非管理员帐户时,SQL Linked Server 返回错误“不存在登录映射”

    我有一个本地 SQL Server 2008R2 我已将链接服务器配置为远程数据库 当我使用 SQL 登录帐户登录本地服务器时 链接服务器工作得很好sysadmin服务器角色 我可以查询远程服务器 因此我知道链接服务器设置是正确的 但是 如

随机推荐

  • 如何使用sql在h2中插入几何图形

    从几个版本开始 h2 确实支持空间几何 在java中选择和插入几何图形不是问题 但是如何在纯sql中插入它们呢 文档显示它使用 WKT 但是当我尝试插入 WKT 时出现错误 这是一个示例插入 insert into feature id n
  • 类 java.util.Map 有泛型类型参数,请使用 GenericTypeIndicator 代替

    我正在使用 firebase 从数据库中检索数据 n 使用 Map
  • 在 __init__.py 中找不到引用“xxx”

    我在 PyCharm 中有一个项目组织如下 Sources init py Calculators init py Filters py Controllers init py FiltersController py Viewers in
  • Flex 订单属性未按预期工作

    我试图得到 通心粉和奶酪真的很好吃 在 网站的主要内容 下方 content padding 0 background 0 float none width auto heading display flex display webkit
  • 删除指针有时会导致堆损坏

    我有一个使用自定义线程池类运行的多线程应用程序 这些线程都执行相同的函数 但参数不同 这些参数通过以下方式传递给线程池类 jobParams is a struct of int double etc jobParams params ne
  • 在 macOS 上安装 data.table

    我需要在 macOS 11 1 上安装 data table 1 12 0 特别是 我收到错误 clang error unsupported option fopenmp make assign o Error 1 我已按照以下说明进行操
  • 在自身内部定义结构对象时出现问题

    这有效 struct LD 32 struct LD 32 ld 但这并没有 struct LD 32 struct LD 32 ld 为什么是这样 正如 pmg 猜测的那样 我将其编译为 C 代码 已编辑 C 中的结构体不能包含类型不完整
  • SLComposeViewController 共享教程 [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 使用 iOS 6 的新功能需要遵循哪些步骤SLComposeViewController发布到 Facebook Twitter 或新浪微博 有关此框架的详细信息 请参阅 Apple
  • Gtk.TreeView 中的 Gtk.Entry (CellRenderer)

    我想打包一个Gtk Entry with Gtk EntryCompletion连接 到一个单元格中Gtk TreeView 有谁知道如何做到这一点 我只需要在表格视图中完成文本输入的输入 我是否需要子类化Gtk CellRenderer
  • 如何以编程方式关闭 iPhone 应用程序中的所有其他应用程序?

    是否可以在我自己的应用程序中以编程方式关闭 iPhone 上除我自己的应用程序之外的所有正在运行的应用程序 如果是这样 怎么办 不可以 所有应用程序都在沙箱中运行 因此您无法在它们之间进行通信 即使你在技术上可以 这也会被认为是不好的做法
  • 提交表格给自己

    目前 我有一个带有输入 文本 和一个提交表单的按钮的表单 该表格被发布到 submit php 我希望将表格发布到与表格相同的页面 我怎样才能做到这一点
  • 使用 boost::spirit::x3 从 std::string 解析为 boost::string_view

    In my 我之前的问题有人建议我的表现boost spirit x3可以通过解析为来改进解析器boost string view使用raw指示 但是 我很难编译它 这是我发现的 Before x3 一个人必须专攻assign to att
  • JAXB:第三方或外部超类上的 @XmlTransient

    我需要有关 JAXB 2 1 的以下问题的一些帮助 示例 我创建了一个扩展抽象类 Person 的 SpecialPerson 类 现在我想使用 JAXB 将对象结构转换为 XML 模式 因此 我不希望 Person XML 类型出现在我的
  • onload() 和 $.ready 之间的区别?

    你能列出之间的区别吗onload and document ready function 使用 jQuery 中的函数 the load窗口和 或主体元素上的事件 又名 onload 将触发一次all页面内容已加载 这包括所有图像 脚本等
  • 解析 Excel 文件并读取单元格

    我有一个excel文件 我已经上传了截图 我需要编写一个 NET应用程序 控制台应用程序 来解析excel文件 您可以看到一个标题为 函数名称 的单元格 我的 NET 应用程序应该找到该特定单元格并读取该列中的内容 例如模板 Instanc
  • 如何在javascript中获取服务器时区

    我想在 Javascript 中设置不同的时区 当前它显示本地计算机或客户端 PC 日期 时区的日期和时区 Regards Javascript 是一种客户端语言 不会以这种方式与服务器交互 您需要从服务器端平台获取该数据 下面是一些 PH
  • 在空 JTextField 中按下退格键时禁用蜂鸣声

    初学者在这里 有谁知道一种快速简便的方法 可以让 JTextField 在按下退格键且字段为空时不发出蜂鸣声 我在网上看到了一些关于更改 DefaultEditorKit 的内容 但我无法理解 任何帮助将不胜感激 这段代码对我有用 Acti
  • AdSense IAB TCF 错误 3.3:如何删除旧字符串并重新获得同意

    我的网站已经上线几年了 使用 AdSense 及其集成的 GDPR 内容功能 即在 IAB TCF 术语中 Google 充当 CMP 在过去的几周里 我收到了以下消息 我们检测到您的一个或多个网站或应用程序上的 IAB TC 字符串存在问
  • 为什么java无法从死锁中恢复?

    我正在读 Java Concurrency in Practice 一书 里面是关于死锁的内容 JVM无法从死锁中恢复 只有摆脱死锁的方法 lock就是重启服务器 还提到了JVM使用graph 搜索其中线程充当两个线程 A 之间的图节点和边
  • Oracle SQL - 识别顺序值范围

    这是我的桌子 ID Name Department 1 Michael Marketing 2 Alex Marketing 3 Tom Marketing 4 John Sales 5 Brad Marketing 6 Leo Marke