Sql 仅跳过首次服务日期
我希望跳过每个客户的第一个服务日期,前提是该服务日期与客户的第一个服务日期匹配 例如,如果客户于2017年4月1日登记 客户注册日期服务日期Sql 仅跳过首次服务日期,sql,sql-server,reporting-services,Sql,Sql Server,Reporting Services,我希望跳过每个客户的第一个服务日期,前提是该服务日期与客户的第一个服务日期匹配 例如,如果客户于2017年4月1日登记 客户注册日期服务日期 sam 1-04-2017 1-04-2017 sam 1-04-2017 1-04-2017 jon 1-04-2017 1-04-2017 jon 1-04-2017 1-05-2017 sam 1-04-2017 1-05-2017 jon 1-04-2017 1-07-2017 摘要页面的预期结果 total clients total s
sam 1-04-2017 1-04-2017 sam 1-04-2017 1-04-2017 jon 1-04-2017 1-04-2017
jon 1-04-2017 1-05-2017 sam 1-04-2017 1-05-2017
jon 1-04-2017 1-07-2017 摘要页面的预期结果 total clients total services 2 4 客户总数服务总数 2 4 希望查看详细信息时的预期结果 客户注册日期服务日期
sam 1-04-2017 1-04-2017 jon 1-04-2017 1-05-2017 sam 1-04-2017 1-05-2017
jon 1-04-2017 1-07-2017 此外,您的客户端有一个注册,但有多个服务。
考虑到查询将上载到ssrs,并且服务日期将是@begindate和@enddate之间的变量s.begindate,我如何跳过查询中的第一个服务日期 根据您的描述,您似乎想要一个使用窗口函数的简单
where
子句:
select t.*
from (select t.*,
min(enrollment_date) over (partition by client) as first_enrollment_date
from t
) t
where first_enrollment_date > service_date;
但是,这将只剩下两项服务,因此不清楚您真正想要什么。根据您提供的服务,我猜您需要这项服务
CREATE TABLE T (id int identity, client varchar(10), enrollment_date date, service_date date)
--client enrollment date service date
INSERT INTO T VALUES
('sam','1-04-2017','1-04-2017'),
('sam','1-04-2017','1-04-2017'),
('jon','1-04-2017','1-04-2017'),
('jon','1-04-2017','1-05-2017'),
('sam','1-04-2017','1-05-2017'),
('jon','1-04-2017','1-07-2017')
DECLARE @StartDate date = '1-04-2017', @EndDate date = '1-07-2017'
SELECT COUNT(DISTINCT client) AS total_clients, COUNT(1)-COUNT(DISTINCT client) AS total_services
FROM T
WHERE service_date BETWEEN @StartDate AND @EndDate
SELECT DISTINCT T.*
FROM T T JOIN (SELECT client, MIN(id) AS enroll_id FROM T GROUP BY client) E
ON T.client = E.client
AND T.id <> E.enroll_id
WHERE service_date BETWEEN @StartDate AND @EndDate
ORDER BY 2, 3
DROP TABLE T
这只是从总计数中减去客户机的不同计数,以抵消注册事件
希望这对您有所帮助。这两个客户是显而易见的。这三项服务是什么?在这种情况下,“抵消”是什么意思?这是一个非常合理的解释。如果OP能澄清这是他真正想要的,那就太好了。是的,一些额外的细节会很好。我开始编写一些类似于您发布的内容的代码,但随后许多服务日期与注册日期匹配的事实让我感到困惑。我喜欢这样简单的解决方案,但总会有一些事情发生……:)大家好,很抱歉没有提供尽可能多的细节。我已经更新了问题以包含更多的细节。@HenryAmadi数据库中你的日期是否真的有时间?您需要能够区分注册日期和服务日期的内容。或者,它们都只是一个没有时间的数据吗?哦,不,它有12:00 am附加到所有。
select t.*
from (select t.*,
min(enrollment_date) over (partition by client) as first_enrollment_date
from t
) t
where first_enrollment_date > service_date;
CREATE TABLE T (id int identity, client varchar(10), enrollment_date date, service_date date)
--client enrollment date service date
INSERT INTO T VALUES
('sam','1-04-2017','1-04-2017'),
('sam','1-04-2017','1-04-2017'),
('jon','1-04-2017','1-04-2017'),
('jon','1-04-2017','1-05-2017'),
('sam','1-04-2017','1-05-2017'),
('jon','1-04-2017','1-07-2017')
DECLARE @StartDate date = '1-04-2017', @EndDate date = '1-07-2017'
SELECT COUNT(DISTINCT client) AS total_clients, COUNT(1)-COUNT(DISTINCT client) AS total_services
FROM T
WHERE service_date BETWEEN @StartDate AND @EndDate
SELECT DISTINCT T.*
FROM T T JOIN (SELECT client, MIN(id) AS enroll_id FROM T GROUP BY client) E
ON T.client = E.client
AND T.id <> E.enroll_id
WHERE service_date BETWEEN @StartDate AND @EndDate
ORDER BY 2, 3
DROP TABLE T
total_clients total_services
------------- --------------
2 4
id client enrollment_date service_date
----------- ---------- --------------- ------------
4 jon 2017-01-04 2017-01-05
6 jon 2017-01-04 2017-01-07
2 sam 2017-01-04 2017-01-04
5 sam 2017-01-04 2017-01-05