在自定义列中显示日期范围 - 间隙和孤岛

2024-04-06

我有一个看起来像这样的表:

+------------+------+
|    Date    | Name |
+------------+------+
| 2017-01-07 | A    |
| 2017-01-08 | A    |
| 2017-01-09 | A    |
| 2017-01-12 | A    |
| 2017-01-07 | B    |
| 2017-01-08 | B    |
| 2017-01-09 | B    |
+------------+------+

我希望能够将其变成以下内容:

+-------------------------+------+
|       Date Range        | Name |
+-------------------------+------+
| 2017-01-07 - 2017-01-09 | A    |
| 2017-01-07 - 2017-01-09 | B    |
| 2017-01-12              | A    |
+-------------------------+------+

该代码将仅查找连续日期的最小值和最大值,并使用Name列,然后在一列中将最小和最大日期列为“往返”字符串。

我在尝试仅列出连续日期时遇到问题。请注意,上面的第三个条目有自己的条目,因为它与前面条目中“A”的日期范围不连续。

编辑:请注意:这是特定于 SQL Server 2008 的,它不允许使用 LAG 函数。


编辑2: McNets 提供的原始答案在 SQL Server 2012 上运行良好。我将其包含在此处,因为如果您有 SQL Server 2012 及以上版本,效果会更好。

;WITH CalcDiffDays AS
(
    SELECT Date, Name,
    CONCAT (Name, CAST(DATEDIFF(DAY, LAG(Date, 1, Date - 1) OVER (PARTITION BY Name ORDER BY Name, Date), Date) AS VARCHAR(10))) AS NumDays
    FROM @tmpTable
)
SELECT CONCAT(CONVERT(VARCHAR(20), MIN(Date), 102), ' - ', CONVERT(VARCHAR(20), MAX(Date), 102)) AS [Data Range], Name
FROM CalcDiffDays
GROUP BY NumDays, Name;

首先,我向整个表添加了行号。

WITH RowN AS
(
    SELECT Date, Name, ROW_NUMBER() OVER (ORDER BY Name, Date) RN
    FROM #T
)

然后我将这个表与其本身连接起来只是为了计算日期之间的天数。

,CalcDiffDays AS
(
    SELECT RowN.Date, RowN.Name,
        ISLAND = RowN.Name + 
        CASE  
           WHEN RowN.RN > 1 AND RowN.Name = R2.Name THEN CAST(DATEDIFF(day, R2.Date, RowN.Date) AS VARCHAR(20))
           ELSE '1'
        END
    FROM RowN
         LEFT JOIN RowN R2 ON R2.RN = RowN.RN-1
)

差距。同名的连续日期之间有多少天。

岛屿。通过将名称添加到计算的天数中。

+---------------------+------+---------+
|         Date        | Name | NumDays |
+---------------------+------+---------+
| 07.01.2017 00:00:00 |   A  |    A1   |
+---------------------+------+---------+
| 08.01.2017 00:00:00 |   A  |    A1   |
+---------------------+------+---------+
| 09.01.2017 00:00:00 |   A  |    A1   |
+---------------------+------+---------+
| 12.01.2017 00:00:00 |   A  |    A3   |
+---------------------+------+---------+
| 07.01.2017 00:00:00 |   B  |    B1   |
+---------------------+------+---------+
| 08.01.2017 00:00:00 |   B  |    B1   |
+---------------------+------+---------+
| 09.01.2017 00:00:00 |   B  |    B1   |
+---------------------+------+---------+

第二部分:获取每个岛屿的最小和最大日期。

WITH RowN AS
(
    SELECT Date, Name, ROW_NUMBER() OVER (ORDER BY Name, Date) RN
    FROM #T
)
,CalcDiffDays AS
(
    SELECT RowN.Date, RowN.Name,
        ISLAND = RowN.Name + 
        CASE  
           WHEN RowN.RN > 1 AND RowN.Name = R2.Name THEN CAST(DATEDIFF(day, R2.Date, RowN.Date) AS VARCHAR(20))
           ELSE '1'
        END
    FROM RowN
         LEFT JOIN RowN R2 ON R2.RN = RowN.RN-1
)    
SELECT CONVERT(VARCHAR(20), MIN(Date), 102) + ' - ' + CONVERT(VARCHAR(20), MAX(Date), 102) AS [Data Range], Name
FROM CalcDiffDays
GROUP BY ISLAND, Name
ORDER BY MIN(Date);

+-------------------------+------+
|        Data Range       | Name |
+-------------------------+------+
| 2017.01.07 - 2017.01.09 |   A  |
+-------------------------+------+
| 2017.01.07 - 2017.01.09 |   B  |
+-------------------------+------+
| 2017.01.12 - 2017.01.12 |   A  |
+-------------------------+------+

可以在这里检查:http://rextester.com/MHLEEJ50479 http://rextester.com/MHLEEJ50479

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

在自定义列中显示日期范围 - 间隙和孤岛 的相关文章

  • 如何检查oracle数据库中分配给模式、角色的对象的权限(DDL、DML、DCL)?

    大多数时候 我们都在与愚蠢的事情作斗争 以获取架构 角色及其对象的权限详细信息 并尝试找到一些简单的方法来获取有关它的所有详细信息以及伪查询代码 以批量生成授予语句以供进一步使用执行 所以我们在这里得到它 关于数据字典视图前缀的一些简单介绍
  • nvarchar 值“3001822585”的转换溢出了 int 列

    我使用以下方法将 Excel 文件导入到 SQL Server Excel 文件将所有值作为字符串 我可以导入文件 除了Barcode SalePrice and Price2 我收到错误 nvarchar 值 3001822585 条形码
  • Oracle 按月滚动或运行总计

    目标 每个月末所有报表的滚动 运行总计 Code select TRUNC ACTHX STMT HX STMT DATE MM AS MNTH COUNT ACTHX INVOICE as STMTS from ACTHX group b
  • REGEXP_REPLACE - 仅当包含在 () 中时才从字符串中删除逗号

    我在 oracle 论坛网站找到了一个例子 输入字符串 a b c x y z a xx yy zz x WITH t AS SELECT a b c x y z a xx yy zz x col1 FROM dual SELECT t c
  • 如何使用第二行中的值填充第一行中的空值?

    我正在尝试编写一个查询 仅显示每个名称的第一行 但这些行的标题为空 因此我想从紧邻的下一行中提取它们的标题 table1 Name Title Row Dan NULL 1 Dan Engineer 2 Dan Developer 3 Ja
  • SQL 约束最小值/最大值?

    有没有办法为数字字段设置 SQL 约束 最小值应为 1234 最大值应为 4523 SQL Server 语法为the check约束 http technet microsoft com en us library ms179491 as
  • MySQL LIKE %string% 不够宽容。我还有什么可以用的吗?

    我有一位客户询问他们的搜索是否可以搜索公司名称 这些名称可以根据用户输入以多种格式进行搜索 例如数据库中存储的公司是 A J R Kelly Ltd 如果用户搜索 一个 J R Kelly 被发现 使用
  • ORA-00933 与内部联接和“as”混淆

    我有一个使用以下命令从两个表中获取数据的查询inner join 但我收到错误SQL command not properly ended as 下面有一个星号 select P carrier id O order id O aircra
  • SQL Server 2012:有条件地增加计数器用户 ROW_NUMBER()

    我正在尝试申请ROW NUMBER 根据特定条件增加计数器 我的数据如下所示 目标计数器是Prep column id DSR PrepIndicator Prep 1662835 1 1 1 1662835 14 2 2 1662835
  • SQL Server 抱怨无效的 json

    我正在使用 Azure 数据工厂和 Azure SQL 数据库编写 ETL 工具 数据工厂捕获映射数据流的输出并将其作为字符串插入到 SQL Server 表 Audit OperationsEventLog 的 StatusMessage
  • SQL Server JOIN 中的 IsNumeric

    我的问题似乎很简单 但我被困在这里 我有一个表 其中有一个名为 SrcID 的 nvarchar 列 我在其中存储数字和字符串 现在 当我尝试在 加入 条件下检查该列上的 IsNumeric 时 如下所示 ISNUMERIC SrcID 1
  • 如何在 Spring Data 中选择不同的结果

    我在使用简单的 Spring Data 查询或 Query 或 QueryDSL 在 Spring Data 中构建查询时遇到问题 如何选择三列 研究 国家 登录 不同的行 并且查询结果将是用户对象类型的列表 Table User Id S
  • 如何引用下一行的数据?

    我正在 PostgreSQL 9 2 中编写一个函数 对于股票价格和日期的表 我想计算每个条目较前一天的百分比变化 对于最早一天的数据 不会有前一天 因此该条目可以简单地为 Nil 我知道WITH声明可能不应该高于IF陈述 到目前为止 这就
  • TSQL - 生成文字浮点值

    我理解比较浮点数时遇到的许多问题 并对它们在这种情况下的使用感到遗憾 但我不是表格作者 只有一个小障碍需要克服 有人决定使用浮点数 就像您期望使用 GUID 一样 我需要检索具有特定浮点值的所有记录 sp help MyTable Colu
  • Spring Data JPA 选择不同

    我有一个情况 我需要建立一个select distinct a address from Person a 其中地址是 Person 内的地址实体 类型的查询 我正在使用规范动态构建我的 where 子句并使用findAll Specifi
  • MySQL:如何获取每个分组的x个结果数[重复]

    这个问题在这里已经有答案了 可能的重复 mysql 在 GROUP BY 中使用 LIMIT 来获取每组 N 个结果 https stackoverflow com questions 2129693 mysql using limit w
  • 如何连续添加起始行和下一行的值

    我只想创建一个 sql 查询 结果就像图片上的那样 类似于 SQL 中的斐波那契数列 Ex Column 1 10 则 Result 列的值为 Result 10 因为这是第一行 然后假设column1第二行的值为50 那么Result第二
  • SQL Server - 将行连接到逗号分隔的列表中

    假设我有一个临时表 如下所示 Id Value 1 1 1 2 1 3 2 1 2 2 我希望我的桌子是这样的 Id ValueList 1 1 2 3 2 1 2 所以基本上我需要将我的值分组为逗号分隔的列表 我已经尝试过以下操作 SEL
  • SQL Server 2008 错误 233

    我正在使用以下 sql 脚本在 SQL Server 2008 中创建新登录名 CREATE LOGIN xyz WITH PASSWORD xyz DEFAULT DATABASE master DEFAULT LANGUAGE us e
  • 分组和切换列和行

    我不知道这是否会被正式称为枢轴 但我想要的结果是这样的 Alex Charley Liza 213 345 1 23 111 5 42 52 2 323 5 23 1 324 5 我的输入数据采用这种形式 Apt Name

随机推荐

  • 在 git 中,如何将我的标签与远程服务器同步?

    有没有办法让我的本地 git 标签与远程标签保持同步 也就是说 不仅在创建时获得新标签 像往常一样 当fetch ing pull ing 而且还可以删除遥控器上不再存在的标签 并在其他人使用时删除现有标签git push f是一个标签 我
  • 实体框架和 WCF(返回附加到上下文的实体)

    我有一个 WCF 服务 它在我的 Repository 对象之一中调用以下方法 以在数据库中创建一个新的销售对象 public static Sale New Sale sale using var ctx new DBcontext ct
  • 如何更改 Minikube 中 api-server 的身份验证机制?

    我有一个本地 minikube 安装 我想更改 api server 的身份验证机制并重新启动并测试它 我读过的所有文档都缺少此信息 是的你可以 kubernetes API 服务器 控制器管理器和调度程序都作为 minikube 中的静态
  • 有没有办法对 unsigned long long A 和 B 执行 (A*B) mod M 而不会溢出?

    我不想经历在 Windows 上安装 GMP 的噩梦 我有两个数字A和B unsigned long longs 最多 10 10 左右的数量级 但即使在这样做时 A M B M M 我得到整数溢出 是否有用于计算的自制函数 A B M对于
  • 特定于操作系统的 CSS?

    过去 我发现不同平台上相同浏览器中的 CSS 几乎没有区别 Mac 上 Safari 上的页面通常与 Windows 上的 Safari 看起来相同 FF Win 与 FF Mac 也是如此 然而 现在我遇到了一个问题 与 PC 浏览器相比
  • 为什么重复捕获组会返回这些字符串?

    有人可以解释为什么以下返回 cc 吗 gt gt gt re match aabbcc group 1 cc 有人告诉我 因为它将每场比赛放入组 1 所以最后一场比赛是 cc 真的吗 那么下面怎么解释呢 gt gt gt re match
  • .net 程序集清单中是否提升了依赖项?

    我使用 VS2010 构建了一个程序集 它具有对 NET 4 0 的普通引用 它还引用了 Ionic Zip 后者引用了 NET 2 0 当我使用 ildasm 查看清单时 我发现 NET 的两个版本都是我的程序集的直接依赖项 并且在 Io
  • Azure 服务总线消息队列用户错误指标

    我正在帮助调查和诊断我们遇到的一些问题 并注意到服务总线队列上的用户错误指标正在发生变化 我想确切地知道这个指标的含义 如文档所示https learn microsoft com en us azure service bus messa
  • 如何通过网页将参数传递到 PHP 脚本中?

    每当网页加载时我都会调用 PHP 脚本 但是 PHP 脚本需要运行一个参数 我在测试脚本时通常通过命令行传递该参数 每次加载页面时运行脚本时如何传递此参数 假设您在命令行上传递参数 如下所示 php path to wwwpublic pa
  • SQL Server分页查询

    呃呃呃 我已经为此苦苦挣扎了很长时间 我可以用 MySQL 轻松做到这一点 但用 SQL Server 就不行 这是应该连接在一起的简化表格 通过使用内连接语法将所有这些组合起来 我必须编写一个查询以用于将来的分页 顺便说一句 PHP 假设
  • 从字典和数组的 plist 中读取/写入数据,并将不同级别加载到 TableView 中

    我对使用属性列表有点困惑 我已经阅读了有关该主题的大多数其他问题 但我仍然很困惑 因为它们只进入一层 因此任何帮助将不胜感激 我想加载一个存储数据的plist 如下所示 我的故事板中有三个视图控制器 两个 TableView 控制器和一个空
  • Android获取当前歌曲播放和歌曲更改事件,例如Musixmatch

    我想要实现的目标非常相似是在做 我需要在音乐开始播放以及歌曲更改时得到通知 所有这些都在服务中 因为我的应用程序可能会关闭 甚至 musicmatch 也会这样做 在上述情况下 即使 Musixmatch 应用程序未运行 当我在 Spoti
  • 如何从 XMLReader 获取属性

    我有一些 HTML 正在转换为Spanned using Html fromHtml 并且我在其中使用了一个自定义标签
  • 如何保持用户登录系统并仅在用户单击注销按钮后注销?

    我正在使用 microsoft asp net 身份的自定义实现 因为我有自定义表 这就是为什么我给出了所有方法的自定义实现IUserStore 和 IUserPasswordStore 问题是当用户登录时 10 15 分钟后登录用户 会话
  • Angular 模板中可观察对象上的 ObjectUnsubscribedErrorImpl

    我正在使用 Angular 11 并且正在使用以下命令访问组件模板中的可观察对象async pipe 路线的第一次加载 一切都工作得很好 没有错误 当我离开该页面并返回时 出现以下错误 组件模板 成分 import Component On
  • 使用 optaplanner 返回调度问题的多个解决方案

    强文本您好 Optaplanner 专家 我对 OptaPlanner 还很陌生 所以请原谅任何幼稚或基本的问题 我用它来安排 set of jobs A B and C which can be completed by 5 resour
  • 如何在android中禁用已经预订的时段

    我必须禁用已经预订的时段并仅向用户显示可用的时段 在回收站视图中 时间从 09 00Am 到 09 00Pm 可见 已预订的时段应处于禁用模式 并且用户只能选择可用的时段 在主要活动中 我存储从 09 00AM 到 09 00PM 的所有时
  • 如何将 SVN 修订号与我的 ASP.NET 网站同步?

    Stack Overflow 底部有一个颠覆版本号 svn 修订版 679 我想在我的应用程序中使用这种自动版本控制 NET Web Site Application Windows 窗体 WPD 项目 解决方案 我该如何实施 看起来杰夫正
  • 我怎样才能看到csrftoken?

    有没有办法直接在View中获取csrftoken 我想获取当前的 csrftoken 但有时会发生变化 因此从 Cookie 获取它不是一个好主意 有什么办法可以做到这一点吗 Thanks 我相信您正在寻找这个 django middlew
  • 在自定义列中显示日期范围 - 间隙和孤岛

    我有一个看起来像这样的表 Date Name 2017 01 07 A 2017 01 08 A 2017 01 09 A 2017 01 12 A 2017 01 07 B 2017 01 08 B 2017 01 09 B 我希望能够将