我有以下内容:
Index dateOfInquiry
649454 2016-02-05
649455 2016-02-05
我有这个问题:
SELECT COUNT(a.dateOfInquiry) as NumberRecords
FROM
(
SELECT ROW_NUMBER() OVER(ORDER BY dateOfInquiry ASC)
Id, dateOfInquiry
FROM
Table
) a
INNER JOIN
(
SELECT ROW_NUMBER() OVER(ORDER BY dateOfInquiry ASC)
Id, dateOfInquiry
FROM
Table
)
b
ON b.ID = a.ID + 1
WHERE ABS( DATEDIFF(d, a.dateOfInquiry, b.dateOfInquiry ) ) > 14
GROUP BY a.strTransactionID
我要做的是每14天只返回1条记录。所以我在上面的数据集中想要1,但我得到0(它消除了两个记录,因为它们之间没有14天)
此外,如果有更多记录并且行为不太正确,它会变得更复杂。如果我在1日,2日,3日等到15日都有记录,我仍然只想要1条记录,然后在16日或之后的下一条记录再次开始计数,忽略进一步的记录,直到差异为止超过14天。
基本上我想将记录计为1,然后忽略所有其他记录,直到14天为止。
另一个样本和我想要的结果是2:
Index dateOfInquiry
649454 2016-02-01 <- count
649455 2016-02-12 -ignore (<l4 past 649454)
649456 2016-02-12 -ignore (<l4 past 649454)
649457 2016-02-17 <- count
649458 2016-02-22 -ignore (<l4 past 649457)
649459 2016-02-25 -ignore (<l4 past 649457)
答案 0 :(得分:1)
使用outer apply()
获取每行的下一个符合条件的行的id
,并使用递归common table expression从头开始并继续前进:
;with cte as (
select t.id, t.dateOfInquiry, x.next_id
from t
outer apply (
select top 1 next_id = i.id
from t as i
where i.dateOfInquiry > dateadd(day,14,t.dateOfInquiry)
order by dateofInquiry, id asc
) x
)
, r_cte as (
--anchor row(s) / starting row(s)
select
id
, dateOfInquiry
, next_id
from cte t
where not exists (
select 1
from cte as i
where i.id < t.id
)
union all
--recursion starts here
select
c.id
, c.dateOfInquiry
, c.next_id
from cte c
inner join r_cte p
on c.id = p.next_id
)
select id, dateOfInquiry
from r_cte
rextester演示:http://rextester.com/PIMVPM32168
返回:
+--------+---------------+
| id | dateOfInquiry |
+--------+---------------+
| 649454 | 2016-02-01 |
| 649457 | 2016-02-17 |
+--------+---------------+
答案 1 :(得分:1)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/moment@latest/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.0/Chart.min.js"></script>
<canvas id="chartBox"></canvas>
你应该提供真实的情景。
尝试我的脚本和其他样本数据。我在递归CTE中使用what is the use of index column in you requirement ?
函数。所以如果没有比这更好的解决方案,那么我认为2 ROW_NUMBER
将是一种更好,更容易理解的方法。
CURSOR