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

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(使用前将#替换为@)

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

  • 日期语句之间的 JPQL SELECT [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我想将此 SQL 语句转换为等效的 JPQL SELECT FROM events WHERE events date BETWE
  • MYSQL从每个类别中随机选择一条记录

    我有一个数据库Items表看起来像这样 id name category int 有几十万条记录 每个item可以是 7 种不同的之一categories 对应于categories table id category 我想要一个从每个类别
  • 我不断收到错误“关系 [TABLE] 不存在”

    我一直在尝试查询数据库中的两个表 在服务器资源管理器中 我可以看到两个表 甚至可以看到其中的列 我们将它们称为 Schema table1 和 Schema table2 其中 Schema 的第一个字母大写 我尝试运行以下查询 selec
  • SQL 约束以防止根据列的先前值更新列

    是否可以使用检查约束 或其他一些技术 来防止在更新记录时设置与其先前值相矛盾的值 一个例子是 NULL 时间戳 表明发生了某些事情 例如 file exported 一旦文件被导出并且具有非 NULL 值 就不应再将其设置为 NULL 另一
  • 如何使用 SQL Server 2008 将行复制到同一个表中

    A 到目前为止我的方式 sqlCommand CommandText INSERT Table1 column1 column2 column3 SELECT column1 column2 column3 FROM Table1 WHER
  • 同时从2个表中删除?

    我正在使用 asp net 和 sql 服务器 我有 2 个表 类别和产品 在产品表中 我的categoryId 为FK 我想要做的是 当我从类别表中删除类别时 我希望该类别中的所有产品都将在产品表中删除 如何才能做到这一点 我更喜欢使用存
  • 关键字“table”附近的语法不正确,无法提取结果集

    我使用 SQL Server 创建了一个项目 其中包含以下文件 UserDAO java public class UserDAO private static SessionFactory sessionFactory static se
  • 使用加权行概率从 PostgreSQL 表中选择随机行

    输入示例 SELECT FROM test id percent 1 50 2 35 3 15 3 rows 你会如何编写这样的查询 平均 50 的时间我可以获得 id 1 的行 35 的时间 id 2 的行 15 的时间 id 3 的行
  • 如何从子查询 SQLite 接收两个值

    我是一个自学的 SQLite 新手 我有三个表 person pet person pet schema 是 CREATE TABLE person id INTEGER PRIMARY KEY first name TEXT last n
  • 组内 STRING_AGG 和 Visual Studio 的问题

    我正在使用 Visual Studio 2015 并且我的 SQL Server 数据库项目中的 STRING AGG Within GROUP 出现问题 SELECT Continent STRING AGG Country WITHIN
  • 使用默认路径中的文件创建数据库

    我想创建一个创建数据库的 SQL 脚本 现在 我有这个 CREATE DATABASE Documents ON PRIMARY NAME N Documents FILENAME N Documents mdf LOG ON NAME N
  • 返回日期为 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
  • Oracle 中仅在一列上不同

    我想在下表中使用不同的值 但仅在 PlayerID 列上使用 这就是我现在所拥有的 MATCHID PLAYERID TEAMID MATCHDATE STARTDATE 20 5 2 14 JAN 12 01 JUN 11 20 5 4
  • SSIS 正在删除平面文件源导入的记录

    我在 SSIS 2008 中遇到了一个非常奇怪的问题 基本工作流程如下 使用平面文件源 CSV 导入 SSIS 推入 SQL 当进程在开发环境中运行时 一切正常 当 dtsx 包投入生产时 使用完全相同的平面文件源 文件中的最后一条记录被删
  • 查询和扫描多行性能缓慢

    下面的查询一行的执行时间为 6 18 分钟 Exception type 1 的基数值为 3 我不知道如何提高性能 Query select count 1 as rage tap from summary funnel 1066 s jo
  • 如何将逗号分隔的列值与另一个表作为行连接

    我试图通过首先转换我正在成功执行的 SupplierId 列中的逗号分隔值来连接两个表 然而 当我尝试通过外键 DCLink 加入另一个带有供应商名称的表 Vendors 时 问题就出现了 这就是我的意思 原始表的 select 语句 SE
  • 在 SQL Server 中选择 XML 元素

    我有一些 XML 需要使用 SQL Server 2008 进行解析 我想我已经接近得到我想要的了 但是我没有正确的语法 我相信 我有以下内容 DECLARE doc XML SET doc
  • 如何在 SQL 选择查询中将行转换为 JSON?

    以下查询将整个表返回为单个 JSON 字符串 JSON 对象列表 每行一个 SELECT FROM MyTable FOR JSON AUTO 我需要返回多行 其中每行都是表中单行的 JSON 字符串 例如 如果表字段为 A B C 输出应
  • 批量插入,asp.net

    我需要获取与会员相对应的 ID 号列表 在任何给定时间处理的数量可能在 10 到 10 000 之间 我可以毫无问题地收集数据 解析数据并将其加载到 DataTable 或任何内容 C 中 但我想在数据库中执行一些操作 将所有这些数据插入表
  • 发布Oracle和SQL Server性能测试是否违反许可? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我想对Oracle和SQL Server中的空间索引进行性能测试 我想将其纳入我的理学硕士工作中 发布此类结果是否违反 dbms 的许可 也许有人已经

随机推荐

  • 在 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 我希望能够将