我有一个记录的子集,看起来像这样:
ID DATE
A 2015-09-01
A 2015-10-03
A 2015-10-10
B 2015-09-01
B 2015-09-10
B 2015-10-03
...
对于每个ID,第一个最小日期是第一个索引记录。现在,我需要排除索引记录30天内的案例,任何日期大于30天的记录都将成为另一个索引记录。
例如,对于ID
A,2015-09-01和2015-10-03都是索引记录,由于相隔30天以上,因此将被保留。2015年10月10日将被删除,因为它距离第二个索引案例的30天之内。
对于IDB,由于它位于第一条索引记录的30天内,因此将删除2015-09-10并将其不作为索引案例。2015-10-03将被保留,因为它距离第一索引记录的时间超过30天,将被视为第二索引情况。
输出应如下所示:
ID DATE
A 2015-09-01
A 2015-10-03
B 2015-09-01
B 2015-10-03
如何在SQL Server 2012中做到这一点?ID可以有多少个日期没有限制,可以是1到5个或更多。我对SQL相当基本,因此任何帮助将不胜感激。
就像您的示例一样,#test是您的数据表:
;with cte1
as
(
select
ID, Date,
row_number()over(partition by ID order by Date) groupID
from #test
),
cte2
as
(
select ID, Date, Date as DateTmp, groupID, 1 as getRow from cte1 where groupID=1
union all
select
c1.ID,
c1.Date,
case when datediff(Day, c2.DateTmp, c1.Date) > 30 then c1.Date else c2.DateTmp end as DateTmp,
c1.groupID,
case when datediff(Day, c2.DateTmp, c1.Date) > 30 then 1 else 0 end as getRow
from cte1 c1
inner join cte2 c2 on c2.groupID+1=c1.groupID and c2.ID=c1.ID
)
select ID, Date from cte2 where getRow=1 order by ID, Date
问题内容: 我想100天前从13年4月8日开始作为日期。 如何使用pl / sql执行此操作? 问题答案: 假设情况是您所处的字符串。因此,您需要将其转换为using函数,然后简单地减去100个文字。 的SQL 2 from dual 3 / RES 29-12-2012 PL / SQL 2 l_res_date date; 3 l_in_date varchar2(11) := ‘08-APR
问题内容: 例如,我有2个时间表:T1 和T2 我需要从T1获取最接近T2的时间。这些表之间没有关系。应该是这样的: 但是我不明白。有什么建议? 问题答案: 我相信这是您要查找的查询: 确保时间列具有相同的日期部分,否则t2.time-t1.time部分将无法正常工作。 编辑 :感谢您的接受,但本的下面的答案是更好。它使用Oracle分析功能,性能会更好。
我有一个输入字段,在这里我可以从日期选择器中选择日期。基于这个选择的值,我需要得到30天的回溯日期。 提前道谢。
问题内容: 假设我有2011年1月3日,我想在一周的第一天,也就是星期天,那是2011年1月2日,我该怎么做? 原因是我有此查询: 是的,我意识到起源拼写错误,但是在此之前我就在这里,因此由于太多内部应用程序引用了它,因此我无法对其进行更正。 因此,我按周分组,但我希望以此填充我的图表,所以我不能让所有的周初看起来都像不同的日期。我该如何解决? 问题答案: 如果您需要处理从星期一开始的几周,也可以
问题内容: 我在舞台上有一组节点,圆。我希望能够单击其中的一个并“选择它”(只是获得对它的引用,以便我可以四处移动,更改颜色等) 问题答案: 我只需要向每个圈子本身注册一个侦听器。然后,您已经具有注册侦听器的圈子的参考。 该示例在可用性方面有所提高,因为它一次显示了10,000个圆圈,但它演示了该技术: 与文件grid.css:
问题内容: 如何获取周六的日期。我今天有约会。 这该怎么做。 例如。今天是 我想输出为 问题答案: 如果您这样调用该函数,它将在下一个星期六返回: “ 6”来自您可以设置的可能值的列表。 您可以通过相应地更改第二个参数来获取星期几。 这是功能: [编辑] 这可能是另一种解决方案。这应该以任何语言工作: