SQL - 添加从条件开始的顺序计数器列,具有分组依据和非递增 ID

2024-06-23

这个问题的棘手版本:SQL-添加从条件开始的顺序计数器列 https://stackoverflow.com/questions/57897292/sql-add-sequential-counter-column-starting-at-condition

我有一张桌子:

create table t (id int, category varchar(4), time1 datetime, market varchar(100));
insert into t (id,category,time1, market) values 
  (1000, 'cat1', '20120618 10:14:09 AM',   'mkt1'), 
  (1002, 'cat1', '20120618 10:14:11 AM',   'mkt2'), 
  (1001, 'cat2', '20120618 10:14:14 AM',  'mkt1'), 
  (1004, 'cat2', '20120618 10:14:15 AM',   'special'), 
  (1003, 'cat2', '20120618 10:14:17 AM',   'mkt2'), 
  (1006, 'cat1', '20120618 10:14:54 AM',   'special'), 
  (1007, 'cat3',  '20120618 10:14:55 AM',  'special'), 
  (1054, 'cat1', '20120618 10:14:58 AM',   'mkt1'), 
  (1023, 'cat1', '20120618 10:14:59 AM',   'mkt2'), 
  (1008, 'cat4', '20120618 10:24:09 AM',  'mkt1'), 
  (1028, 'cat2', '20120618 10:24:10 AM',   'special'), 
  (1021, 'cat1', '20120618 10:24:29 AM',   'mkt2'), 
  (1017, 'cat1', '20120618 10:34:49 AM',   'mkt2'), 
  (1019, 'cat1',  '20120618 10:34:57 AM',  'special')

如何从表中选择所有列,同时添加顺序计数器列,一旦触发条件,该计数器列就开始计数(在本例中)market='special'),分组依据category并与id那列不一定是增量的?

结果应该如下所示:

id    category  time1                  market  count
1000  cat1      20120618 10:14:09 AM   mkt1    0
1002  cat1      20120618 10:14:11 AM   mkt2    0
1001  cat2      20120618 10:14:14 AM   mkt1    0
1004  cat2      20120618 10:14:15 AM   special 1
1003  cat2      20120618 10:14:17 AM   mkt2    2
1006  cat1      20120618 10:14:54 AM   special 1
1007  cat3      20120618 10:14:55 AM   special 1
1054  cat1      20120618 10:14:58 AM   mkt1    2
1023  cat1      20120618 10:14:59 AM   mkt2    3
1008  cat4      20120618 10:24:09 AM   mkt1    0
1028  cat2      20120618 10:24:10 AM   special 3
1021  cat1      20120618 10:24:29 AM   mkt2    4
1017  cat1      20120618 10:34:49 AM   mkt2    5
1019  cat1      20120618 10:34:57 AM   special 6

首先它生成cnt by category

然后它找到cnt for special按类别

决赛count只是减去cnt with cnt of special

;with 
cte as 
(
    select  t.id, t.category, t.market, t.time1, 
            cnt = row_number() over (partition by t.category order by t.time1)
    from    t 
),
special as
(
    select  category, cnt = min(cnt)
    from    cte
    where   market  = 'special'
    group by category
)
select  c.id, c.category, c.market, c.time1, 
        [count]     = case  when    c.cnt < s.cnt 
                            or      s.cnt is null 
                            then    0 
                            else    c.cnt - s.cnt + 1 
                            end
from    cte c
        left join special s on  c.category  = s.category
order by time1

Note : left join special被使用,因为有一些category没有special

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

SQL - 添加从条件开始的顺序计数器列,具有分组依据和非递增 ID 的相关文章

  • 使用 WHILE 创建虚拟数据

    我尝试使用 a 在表中插入一些虚拟数据WHILE 但它运行得非常非常慢 我在想也许我写的代码不正确 你能看一下并确认一下吗 Insert dummy data DECLARE i int Content int SET i 5001 WHI
  • 列中差异的数量

    我想检索一列每行中有多少个字母的差异 例如 如果您有一个值 test 而另一行有一个值 testing 则 test 和 testing 之间的差异为 4 个字母 该列的数据值为 4 I have reflected about it an
  • 选择具有 SQL Server XML 列类型的特定行

    我正在尝试从类似于以下定义的表中选择数据 Column Data Type Id Int DataType Int LoggedData XML 但我只想选择具有特定 DataType 值并且在 LoggedData 列中包含字符串 或评估
  • SQL 国家字符 (NCHAR) 数据类型的真正用途是什么?

    也CHAR CHARACTER and VARCHAR CHARACTER VARYING SQL 提供了NCHAR NATIONAL CHARACTER and NVARCHAR NATIONAL CHARACTER VARYING 类型
  • SQL Server:从 OPENDATASOURCE 中删除

    这有效 SELECT FROM OPENDATASOURCE Microsoft ACE OLEDB 12 0 Data Source d JobFiles MyFile xlsx Extended properties Excel 8 0
  • 在存储过程中验证用户的最简单方法?

    我需要一个存储过程 可以通过发送以下内容来检查登录尝试时他们是否是有效用户login and password查看它们在数据库中是否匹配 有没有一种简单的方法可以做到这一点 如果没有更多信息 我目前能提供的最好信息是 CREATE STOR
  • 解析带下划线的 SQL Server 数字文字

    我想知道它为什么有效以及为什么它不返回错误 SELECT 2015 11 Result 11 2015 第二种情况 SELECT 2 1 a a 2 1 检查元数据 SELECT name system type name FROM sys
  • 返回日期为 null 作为 t-sql 中的最大值

    我有这张桌子 ID Date Value 3241 9 17 12 5 3241 9 16 12 100 3241 9 15 12 20 4355 9 16 12 12 4355 9 15 12 132 4355 9 14 12 4 100
  • 针对表中的每一行运行 SQL Server 函数

    我有一个函数可以迭代表中的 每一行 当它运行时 它应该查看每一行 提取该行的相关 SET 值并运行该函数 该函数依次返回结果并使用正确的值更新正确的行 发生的情况是 它正在运行并返回最后一行的值 并用该值更新所有行 有什么想法我做错了吗 S
  • 在 SQL Server 中使用透视(错误)- 列名无效

    SELECT Reg number Surname SESREFDATETIME1 ATTENDANCE1 SESREFDATETIME2 ATTENDANCE2 SESREFDATETIME3 ATTENDANCE3 SESREFDATE
  • 分解 SQL 表中每一行的 XML

    我有一个表 其中包含两列 ID 和 XML 数据 我想分解每个 ID 的 XML 我在 XML 中提取单个值 并且所有 XML 的结构都相同 我只是不确定如何循环遍历表并将 XML 查询应用于每一行 我需要应用的查询如下 Select to
  • Microsoft T-SQL 到 Oracle SQL 的转换

    我已经使用 T SQL 多年了 但我刚刚转到一个需要编写一些 Oracle 内容的组织 可能只是简单的 CRUD 操作 至少在我适应之前是这样 我不会将数据库从一个数据库迁移到另一个数据库 只是从应用程序开发的角度与现有 Oracle 数据
  • 查找每个客户组的最新帐户

    我有一个包含客户信息的表 每个客户都会分配一个客户 ID 他们的 SSN 他们在开设更多帐户时会保留该 ID 两个客户可能使用同一个帐户 每个客户都有自己的 ID 帐号不按日期排序 我想找到每个客户或客户组的最新帐户 如果两个客户曾经一起使
  • SQL Server 2014执行计划创建需要很长时间(旧版本中很快)

    我在 SQL Server 2014 中遇到一个查询问题 第一次运行该查询时 需要很长时间才能生成执行计划 奇怪的是 它在 SQL Server 的所有早期版本 2012 2008 R2 2008 等 中都运行良好 它似乎与所涉及的表之一上
  • T-SQL 中的不等式测试

    我刚刚在 WHERE 子句中遇到了这个 AND NOT t id id 这与以下内容相比如何 AND t id id Or with AND t id lt gt id 我总是自己写后者 但显然其他人有不同的想法 其中一个的表现会比另一个更
  • 简单的t-sql而不是触发器

    任何人都可以帮助解决简单的 t sql 脚本与板载触发器的问题吗 我使用非常简单的触发器将数据从一个表复制到另一个表 这些表之间没有关系 当我尝试在触发器创建后 从同一脚本 直接第一次插入数据时 我得到了所需的结果 但所有接下来的尝试都会失
  • 批量更新 SQL Server C#

    我有一个 270k 行的数据库 带有主键mid和一个名为value 我有一个包含中值和值的文本文件 现在我想更新表格 以便将每个值分配给正确的中间值 我当前的方法是从 C 读取文本文件 并为我读取的每一行更新表中的一行 必须有更快的方法来做
  • t-sql计算文本列中的唯一单词

    我有一列包含图像标题 我想做的是找到该栏中出现的最流行的单词 有没有办法用 t sql 来做到这一点 我认为你可以做这样的事情 我认为这不是最优化的 但您可以对其进行改进 创建一个表变量 t来存储单词 创建一个游标 循环浏览字幕表中的每一行
  • T-SQL 中的异步存储过程调用

    如何从另一个存储过程对存储过程进行异步调用 假设我有两个存储过程 SP1 和 SP2 这是一个长时间运行的存储过程 需要很长时间执行 并且不返回任何结果 存储过程SP1定义如下 CREATE PROCEDURE SP1 AS BEGIN c
  • 邮政编码 10 位数字字符使用的约束检查

    我有一张桌子 上面有Char 10 列类型 命名postal Code我需要对所有值进行约束检查 就像 10 位数字一样1234567890没有别的 我使用以下内容 CONSTRAINT CH PCDigit CHECK PostalCod

随机推荐

  • 什么是日历队列?

    我正在致力于构建一个离散事件模拟器 维基百科提到有几种通用优先级队列非常适合在 DES 中使用 具体来说 它提到日历队列是一个很好的结构 我找到了一份 pdf 1988 年的 其中提到了日历队列 但在大多数情况下我找不到关于它们的任何其他内
  • 如何在 python 套接字中使用浏览器作为客户端?

    我试图在互联网上搜索这个主题 但我没有找到一些答案 如果有人知道如何在 python 套接字中使用浏览器作为客户端 那就太好了 要将浏览器用作 python 服务器 套接字的客户端 您只需将其指向正确的端点即可 假设您在同一台计算机上运行浏
  • 当脚本执行暂停时,如何在 chrome devtools 中运行异步代码?

    await Promise resolve 1 在 chrome devtools chrome 版本 70 0 3538 77 中解析为 1当脚本执行未暂停时 Promise
  • 整个 Inno Setup 安装程序的完整性检查

    我们使用 Inno Setup 作为安装程序 最近有用户在安装过程中报告如下错误 尝试复制文件时发生错误 源文件已损坏 这是由于安装文件确实已损坏 理想情况下 安装 EXE 会在初始化时执行某种检查 以查看整个 EXE 是否有效 但显然它只
  • C# Directory.exist 在本地网络上始终返回 false

    我正在尝试检查目录是否存在于非网络或本地网络上 经过对 stackoverflow 和 MSDN 的一些研究后 我使用模拟方法开发了我的代码 问题是它运作得不太好 Directory exists 方法总是返回False这是我的代码 它与来
  • 迷你分析器 nullreferenceException

    当我正在运行的存储过程执行迷你分析器时 它会抛出空引用并导致我的应用程序停止 在这种情况下 SP 不会返回任何内容 这是堆栈跟踪 at MvcMiniProfiler MiniProfiler AddSqlTiming SqlTiming
  • Javascript 将相同的类添加到 Div,而不需要为每个 Div 进行计算

    我显示了 2 张优惠券 它们都有 new coupon 而实际上一张应该说 new coupon 一张应该说 old coupon 它似乎为页面上具有该类的每个元素应用相同的类 而不是计算每个元素应该属于哪个类 jQuery documen
  • 如何在 Silverlight 4 中释放 COM 对象

    当将 COM Interop 与 Office 通常是 Excel 一起使用时 我总是小心地确保我调用Marshal ReleaseComObject在每个引用上 以避免 Excel 不退出的问题如本知识库文章中所述 http suppor
  • 错误:未指定默认引擎且未提供扩展名

    我正在使用 node js 和引擎设置 http 服务器 但是 我不断遇到一些问题 我对如何解决这个问题知之甚少 我希望能得到一些帮助来解决这个问题 Error No default engine was specified and no
  • 正确地将 for 循环转换为并行循环

    我这里有这个数据集 例如 学生在几年内多次参加考试 要么通过 要么失败 我有兴趣研究上一次测试对下一次测试的影响 id sample int 10000 100000 replace TRUE res c 1 0 results sampl
  • 过滤长时间序列Python的最有效方法

    我有一个很大的时间序列 比如 1e10 它是记录神经活动 即电压 的结果 在进行进一步分析之前 我想对 300 Hz 到 7000 Hz 之间的数据进行带通滤波 下面 我发布了我设计的巴特沃斯滤波器的代码 如何使这个过滤器更快 运行时间太长
  • 如何将缓冲区重命名为类似的名称

    这种情况经常发生在我身上 我正在使用多个M x shell贝壳同时 要打开下一个 shell 我必须将第一个 shell 重命名为rename buffer 然而 emacs 只是提示新的缓冲区名称 而不允许我重用现有的缓冲区名称来构建相关
  • 将 HTTP GET 请求中的 JSON 数据从 JAVA 代码发送到 REST API

    我正在向我的 API 成功发出以下curl 请求 curl v X GET H Content Type application json d query some text mode 0 http host domain abc com
  • 将 winform 树视图转换为 wpf 树视图

    我已经构建了一个在 winforms 中生成树视图的函数 它包括具有递归的子文件夹和文件 现在我想将其转换为 wpf 我不知道如何处理课程 我知道我必须制作自己的自定义类 treenode 它有一个属性 parent 类似于 winform
  • JASIG CAS:单点注销不起作用

    我的单点登录工作得很好 但单点退出不起作用 场景是这样的 打开 webapp1 并重定向到 CAS 登录页面 输入详细信息并登录 打开也使用 CAS 的 webapp2 自动登录 因为用户已经登录 退出 webapp1 尝试打开 webap
  • 已弃用在 c 中从字符串常量到“char*”的转换[重复]

    这个问题在这里已经有答案了 我正在使用字符串 每当我执行以下程序时 我都会收到错误已弃用从字符串常量到 char 的转换 in c 在线上char p hello 我究竟做错了什么 这个错误是什么意思 我该如何纠正它 我的代码是 inclu
  • CallKit 错误 com.apple.CallKit.error.requesttransaction 错误 2

    我尝试过很多使用 CallKit 在 ios swift 上发起拨出呼叫的示例 我已经在功能中启用了 VOIP 在所有情况下 它都会失败 callController request transaction error in if let
  • bash 中的 SIGINT 和进程替换

    我发现如果我有类似的东西 usr bin env bash function abort politely echo Aborting politely sleep 5 touch stop trap abort politely SIGI
  • 验证是否存在唯一字符串的组合

    class Details String name String age String email String location 1 如果有详细信息列表 如下所示List
  • SQL - 添加从条件开始的顺序计数器列,具有分组依据和非递增 ID

    这个问题的棘手版本 SQL 添加从条件开始的顺序计数器列 https stackoverflow com questions 57897292 sql add sequential counter column starting at co