Question

以下是我的数据片段:

Create Table Emps(person VARCHAR(50), started DATE, stopped DATE);

Insert Into Emps Values
('p1','2015-10-10','2016-10-10'),
('p1','2016-10-11','2017-10-11'),
('p1','2017-10-12','2018-10-13'),
('p2','2019-11-13','2019-11-13'),
('p2','2019-11-14','2020-10-14'),
('p3','2020-07-15','2021-08-15'),
('p3','2021-08-16','2022-08-16');

db<>fiddle.

我想使用T-SQL来统计有多少人符合以下标准--at least once的倍数也应算作1:

对于一个人来说:

  1. "Start"中的一个日期(例如s1)至少晚于"End"中的一个日期(例如e1)
  2. s1e1在同一年,需要手动设置-例如,‘2021-01-01’到‘2022-01-01’

Example expected response

如果我将日期范围‘2016-01-01’到‘2017-01-01’放在WHERE/HAVING子句中的某个位置,则输出应为1,因为只有p1的开始日期和结束日期都在2016年,且开始日期大于结束日期:

s1='2016-10-11',e1='2016-10-10'.

Why can't I do this myself

我被困住的原因是我不知道如何在组之间进行逐行比较.该问题要求在Person ID内比较不同列(从开始到结束)、不同行之间的值.

推荐答案

使用条件聚合以获取给定范围内的最大开始日期和最小停止日期.

select person
from emps
group by person
having max(case when started >= '2016-01-01' and started < '2017-01-01' 
           then started end) > 
       min(case when stopped >= '2016-01-01' and stopped < '2017-01-01' 
           then stopped end);

演示:https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=45adb153fcac9ce72708f1283cac7833

Sql相关问答推荐

Postgres,使用iLike运算符从json数组中搜索的工作方式与从常规表中搜索不同

在请求结束之前,PostgreSQL不会考虑使用中的删除

如何使用WSO2将空值传递给我的SQL Server存储过程?

如何在presto/SQL中使用两个数组列创建(分解)单独的行

如何在postgres函数中插入后返回布尔值?

从列中提取子字符串的ORDER BY CASE语句

如何设计一个调用嵌套函数并仅在所有被调用的嵌套函数都提交时才提交的事务,例如,如果一个子函数失败则中止?

每小时 Select 1行

了解多个分组集

MS Access问题查询中的自定义字段

postgres中的条件索引和触发器

使用递归CTE在BigQuery中获取文件路径

Snowflake 中的分层数据

计算不同模式的时间跨度

POSTGRES to_timestamp() 假定 UTC 字符串为本地时间

INSERT INTO 语法

有没有办法在雅典娜中将字符串转换为 int ?

Django only() 和 values() 不适用于 prefetch_related()

使用标准SQL 触发更新当前日期

当计数为 0 时显示行