sql - 如何根据条件增加计数
问题描述
我正在尝试根据条件提取新列,因此新列将充当计数器,并且它只会计算 if (MessageDate1- MessageDate2).TotalMinutes > 10
。
例如,如果我有以下输入:
╔════════════════╦═══════════════════════╦═══════════════════════╗
║ ConversationId ║ MessageDate1 ║ MessageDate2 ║
╠════════════════╬═══════════════════════╬═══════════════════════╣
║ 1 ║ 2/15/2012 11:53:16 AM ║ 1/1/0001 12:00:00 AM ║
║ 1 ║ 2/16/2012 11:53:20 AM ║ 2/15/2012 11:53:16 AM ║
║ 1 ║ 2/16/2012 11:54:01 AM ║ 2/16/2012 11:53:20 AM ║
║ 1 ║ 2/16/2012 11:05:03 PM ║ 2/16/2012 11:54:01 AM ║
║ 1 ║ 2/16/2012 11:09:03 PM ║ 2/16/2012 11:05:03 PM ║
║ 1 ║ 2/16/2012 11:11:03 PM ║ 2/16/2012 11:09:03 PM ║
║ 1 ║ 2/16/2012 11:11:04 PM ║ 2/16/2012 11:11:03 PM ║
║ 1 ║ 2/16/2012 11:11:05 PM ║ 2/16/2012 11:11:04 PM ║
║ 1 ║ 2/16/2012 11:22:06 PM ║ 2/16/2012 11:11:05 PM ║
║ 1 ║ 2/17/2012 11:05:03 PM ║ 2/16/2012 11:22:06 PM ║
║ 1 ║ 2/17/2012 11:09:03 PM ║ 2/17/2012 11:05:03 PM ║
║ 1 ║ 2/17/2012 11:11:03 PM ║ 2/17/2012 11:09:03 PM ║
║ 2 ║ 2/15/2012 11:53:18 AM ║ 1/1/0001 12:00:00 AM ║
║ 2 ║ 2/16/2012 11:54:01 AM ║ 2/15/2012 11:53:18 AM ║
║ 2 ║ 2/16/2012 11:54:02 AM ║ 2/16/2012 11:54:01 AM ║
║ 3 ║ 2/16/2012 11:53:50 AM ║ 1/1/0001 12:00:00 AM ║
║ 3 ║ 2/16/2012 11:54:50 AM ║ 2/16/2012 11:53:50 AM ║
║ 4 ║ 2/16/2012 11:54:04 AM ║ 1/1/0001 12:00:00 AM ║
╚════════════════╩═══════════════════════╩═══════════════════════╝
所以输出将是:
╔════════════════╦═══════════════════════╦═══════════════════════╦═════════╗
║ ConversationID ║ MessageDate1 ║ MessageDate2 ║ Counter ║
╠════════════════╬═══════════════════════╬═══════════════════════╬═════════╣
║ 1 ║ 2/15/2012 11:53:16 AM ║ 1/1/0001 12:00:00 AM ║ 1 ║
║ 1 ║ 2/16/2012 11:53:20 AM ║ 2/15/2012 11:53:16 AM ║ 2 ║
║ 1 ║ 2/16/2012 11:54:01 AM ║ 2/16/2012 11:53:20 AM ║ 2 ║
║ 1 ║ 2/16/2012 11:05:03 PM ║ 2/16/2012 11:54:01 AM ║ 3 ║
║ 1 ║ 2/16/2012 11:09:03 PM ║ 2/16/2012 11:05:03 PM ║ 3 ║
║ 1 ║ 2/16/2012 11:11:03 PM ║ 2/16/2012 11:09:03 PM ║ 3 ║
║ 1 ║ 2/16/2012 11:11:04 PM ║ 2/16/2012 11:11:03 PM ║ 3 ║
║ 1 ║ 2/16/2012 11:11:05 PM ║ 2/16/2012 11:11:04 PM ║ 3 ║
║ 1 ║ 2/16/2012 11:22:06 PM ║ 2/16/2012 11:11:05 PM ║ 4 ║
║ 1 ║ 2/17/2012 11:05:03 PM ║ 2/16/2012 11:22:06 PM ║ 5 ║
║ 1 ║ 2/17/2012 11:09:03 PM ║ 2/17/2012 11:05:03 PM ║ 5 ║
║ 1 ║ 2/17/2012 11:11:03 PM ║ 2/17/2012 11:09:03 PM ║ 5 ║
║ 2 ║ 2/15/2012 11:53:18 AM ║ 1/1/0001 12:00:00 AM ║ 6 ║
║ 2 ║ 2/16/2012 11:54:01 AM ║ 2/15/2012 11:53:18 AM ║ 7 ║
║ 2 ║ 2/16/2012 11:54:02 AM ║ 2/16/2012 11:54:01 AM ║ 7 ║
║ 3 ║ 2/16/2012 11:53:50 AM ║ 1/1/0001 12:00:00 AM ║ 8 ║
║ 3 ║ 2/16/2012 11:54:50 AM ║ 2/16/2012 11:53:50 AM ║ 8 ║
║ 4 ║ 2/16/2012 11:54:04 AM ║ 1/1/0001 12:00:00 AM ║ 9 ║
╚════════════════╩═══════════════════════╩═══════════════════════╩═════════╝
解决方案
设置一些虚拟数据来反映您提出的问题:
create table some_data
(
id int,
MessageDate1 datetime,
MessageDate2 datetime
)
insert into some_data values
(1,'2012-02-15 11:53:16', '2012-02-15 00:00:00'),
(2,'2012-02-16 11:53:20', '2012-02-15 11:53:16'),
(3,'2012-02-16 11:54:01', '2012-02-15 11:53:20'),
(4,'2012-02-16 23:05:03', '2012-02-16 11:54:01'),
(5,'2012-02-16 23:09:03', '2012-02-16 23:05:03'),
(6,'2012-02-16 23:11:03', '2012-02-16 23:09:03'),
(7,'2012-02-16 23:11:04', '2012-02-16 23:11:03'),
(8,'2012-02-16 23:11:05', '2012-02-16 23:11:04'),
(9,'2012-02-16 23:22:06', '2012-02-16 23:11:05'),
(10,'2012-02-17 23:05:03', '2012-02-16 23:22:06'),
(11,'2012-02-17 23:09:03', '2012-02-17 23:05:03'),
(12,'2012-02-17 23:11:03', '2012-02-17 23:09:03'),
(13,'2012-02-15 11:53:18', '2012-02-15 00:00:00'),
(14,'2012-02-16 11:54:01', '2012-02-15 11:53:18'),
(15,'2012-02-16 11:54:02', '2012-02-16 11:54:01'),
(16,'2012-02-16 11:53:50', '2012-02-16 12:00:00'),
(17,'2012-02-16 11:54:50', '2012-02-16 11:53:50'),
(18,'2012-02-16 11:54:04', '2012-02-16 00:00:00')
我已经包含一个id
字段以允许我对记录进行排序,因为我看不到任何特定逻辑来说明您的示例数据是如何排序的,并且计数的工作方式取决于记录的顺序。我还替换了您当年的日期值0001
。
此查询给出了我认为所需的输出,Count
每次遇到记录时MessageDate1
和MessageDate2
字段之间的差异超过 10 分钟时都会递增:
select
MessageDate1,
MessageDate2,
sum(GT_10M) over (order by id) as [Count]
from
(
select
id,
MessageDate1,
MessageDate2,
case when abs(datediff(minute,MessageDate2,MessageDate1)) > 10 then 1 else 0 end as GT_10M
from some_data
) r
结果:
/-----------------------------------------------------------\
| MessageDate1 | MessageDate2 | Count |
|-------------------------|-------------------------|-------|
| 2012-02-15 11:53:16.000 | 2012-02-15 00:00:00.000 | 1 |
| 2012-02-16 11:53:20.000 | 2012-02-15 11:53:16.000 | 2 |
| 2012-02-16 11:54:01.000 | 2012-02-15 11:53:20.000 | 3 |
| 2012-02-16 23:05:03.000 | 2012-02-16 11:54:01.000 | 4 |
| 2012-02-16 23:09:03.000 | 2012-02-16 23:05:03.000 | 4 |
| 2012-02-16 23:11:03.000 | 2012-02-16 23:09:03.000 | 4 |
| 2012-02-16 23:11:04.000 | 2012-02-16 23:11:03.000 | 4 |
| 2012-02-16 23:11:05.000 | 2012-02-16 23:11:04.000 | 4 |
| 2012-02-16 23:22:06.000 | 2012-02-16 23:11:05.000 | 5 |
| 2012-02-17 23:05:03.000 | 2012-02-16 23:22:06.000 | 6 |
| 2012-02-17 23:09:03.000 | 2012-02-17 23:05:03.000 | 6 |
| 2012-02-17 23:11:03.000 | 2012-02-17 23:09:03.000 | 6 |
| 2012-02-15 11:53:18.000 | 2012-02-15 00:00:00.000 | 7 |
| 2012-02-16 11:54:01.000 | 2012-02-15 11:53:18.000 | 8 |
| 2012-02-16 11:54:02.000 | 2012-02-16 11:54:01.000 | 8 |
| 2012-02-16 11:53:50.000 | 2012-02-16 12:00:00.000 | 8 |
| 2012-02-16 11:54:50.000 | 2012-02-16 11:53:50.000 | 8 |
| 2012-02-16 11:54:04.000 | 2012-02-16 00:00:00.000 | 9 |
\-----------------------------------------------------------/
推荐阅读
- core-data - 在 CoreData 中保存项目启动导航
- java - 复杂的 SQL 语法集成 - FOR UPDATE - WITH - KEEP
- google-chrome - 如何找出哪个应用程序添加了 chrome 扩展?
- javascript - 在 Angular 中使用了对象标签但未找到相机
- c++ - 多态中的函数对象
- android - Androidx CardView 未在所有设备中按预期显示圆形图像
- postgresql - MULTILINESTRING 附近的 rgeo 点
- php - WordPress主页更改不起作用
- python - “无法找到用于 ipykernel 启动的内核规范”错误在我在虚拟工作室上运行时发生
- javascript - 邮递员在使用 GET 请求时返回空