如何根据其他属性值过滤日期范围 [英] How do I filter date range depend on another attribute value

查看:75
本文介绍了如何根据其他属性值过滤日期范围的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个包含顺序和目标日期序列的数据集。我需要在给定的目标日期范围之间检索数据,并且应该包括从头到尾的整个序列顺序。



TNARef    ;     TargetDate          序列

< b> ---------- &NBSP;&NBSP;&NBSP;&NBSP;&NBSP; ------------- &NBSP;&NBSP;        -----------

TNA0001    &NBSP; 02/01/2016             1

TNA0001    &NBSP; 02/02/2016&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; 2

TNA0001    &NBSP; 2月7日/ 2016&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; 3



TNA0002    &NBSP; 02/02/2016&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; 1

TNA0002    &NBSP; 2月5日/ 2016&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; 2

TNA0002    &NBSP; 2月8日/ 2016&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; 3



TNA0003    &NBSP; 01 /2016分之26&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; 1

TNA0003    &NBSP; 2月1日/ 2016&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; 2

TNA0003    &NBSP; 02/03/2016&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; 3



TNA0004    &NBSP; 01/20/2016年&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; 1

TNA0004    &NBSP; 01 /2016分之26&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; 2

TNA0004    &NBSP; 02/02/2016&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; 3



在我的查询中我可以得到以下结果

目标日期: 02/01/2016至02/10/2016



TNARef        TargetDate          序列

---------- &NBSP;&NBSP;&NBSP;&NBSP;&NBSP; ------------- &NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; -----------

TNA0001    &NBSP; 02/01/2016             1

TNA0001    &NBSP; 02/02/2016&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; 2

TNA0001    &NBSP; 2月7日/ 2016&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; 3



TNA0002    &NBSP; 02/02/2016&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; 1

TNA0002    &NBSP; 2月5日/ 2016&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; 2

TNA0002    &NBSP; 2月8日/ 2016&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; 3



TNA0003    &NBSP; 2月1日/ 2016&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; 2

TNA0003    &NBSP; 02/03/2016&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; 3



TNA0004    &NBSP; 02/02/2016&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; 3





但只需要过滤



TNARef        TargetDate          顺序

----------       ------- ------          -----------

TNA0001    &NBSP; 02/01/2016             1

TNA0001    &NBSP; 02/02/2016&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; 2

TNA0001    &NBSP; 2月7日/ 2016&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; 3



TNA0002    &NBSP; 02/02/2016&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; 1

TNA0002    &NBSP; 2月5日/ 2016&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; 2

TNA0002    &NBSP; 2月8日/ 2016&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; 3





我怎样才能通过SQL做到这一点?请帮助我们

I have a DATASET with sequence of order and target date. I need to retrieve data in between given target date range and there should include entire sequence order from beginning to end.

TNARef      TargetDate        Sequence
----------     -------------        -----------
TNA0001      02/01/2016              1
TNA0001      02/02/2016              2
TNA0001      02/07/2016              3

TNA0002      02/02/2016              1
TNA0002      02/05/2016              2
TNA0002      02/08/2016              3

TNA0003      01/26/2016              1
TNA0003      02/01/2016              2
TNA0003      02/03/2016              3

TNA0004      01/20/2016              1
TNA0004      01/26/2016              2
TNA0004      02/02/2016              3

In my query i can get following result
Target Date: 02/01/2016 To 02/10/2016

TNARef      TargetDate        Sequence
----------     -------------        -----------
TNA0001      02/01/2016              1
TNA0001      02/02/2016              2
TNA0001      02/07/2016              3

TNA0002      02/02/2016              1
TNA0002      02/05/2016              2
TNA0002      02/08/2016              3

TNA0003      02/01/2016              2
TNA0003      02/03/2016              3

TNA0004      02/02/2016              3


But only need to filter

TNARef      TargetDate        Sequence
----------     -------------        -----------
TNA0001      02/01/2016              1
TNA0001      02/02/2016              2
TNA0001      02/07/2016              3

TNA0002      02/02/2016              1
TNA0002      02/05/2016              2
TNA0002      02/08/2016              3


How can i do that only by SQL? Please help me guys

推荐答案

如果我理解正确,你只想选择整个序列是否在范围内。首先,您需要知道每个参考的最大和最小日期,然后根据它进行过滤。假设您使用的是SQL Server并且有两个名为@FromTargetDate和@ToTargetDate的参数:

If I understand you correctly you want to select only if the entire sequence falls into the range. First you need to know the max and min date for each reference and then filter based on that. Assuming you are using SQL Server and have two parameters named @FromTargetDate and @ToTargetDate:
with cte1 as 
(
    SELECT TNARef, Min(TargetDate) AS MinDate, Max(TargetDate) AS MaxDate
    FROM yourtable
    GROUP BY TNARef
)
, cte2 AS
(
    SELECT TNARef
    FROM cte1
    WHERE MinDate >= @FromTargetDate
      AND MaxDate <= @ToTargetDate 
)
SELECT *
FROM yourtable
WHERE TNARef IN (SELECT TNARef FROM cte2)



当然,查询的结构可以不同并进行优化,但我喜欢使用CTE,因为它们更容易理解。


Of course the query could be structured differently and optimized, but I like to use CTEs because they are easier to follow.


这篇关于如何根据其他属性值过滤日期范围的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆