我想查询一个具有帐号的表,但是我需要一个从任意数字开始的60000的连续范围,只要它是连续的就没有关系。
我什么都没想,我只是查询之间有一个基本的方法,但这甚至不好,因为我不想或不需要指定开始,只需要顺序范围即可。
Select *
From tableA
where account number between acctNum1 and acctNum2;
连续60000个帐号。
因此,如果有1到1百万个帐号,并且帐号中存在随机间隔,我想看看能否得到60000个但连续的数量。
答案 0 :(得分:2)
也许是这样的:
以下返回具有60,000个连续记录的所有可能范围的列表。
它返回3列StartAcct#,RN和EndAcct#。开头和结尾定义了您可以使用的范围。
WITH CTE2 as (SELECT *, row_number() over (order by accountNumber) RN FROM SrcTable)
, CTE3 as (SELECT AccountNumber as StartAcct#
, RN, LEAD(AccountNumber,60000-1) over(order by rn) as EndAcct#
FROM CTE2 A)
SELECT *
FROM CTE3
WHERE EndAcct#-StartAcct# = 60000-1
例如,可能会返回:(如果您正在寻找20的差距)...
+----+------------+----+----------+
| | StartAcct# | RN | EndAcct# |
+----+------------+----+----------+
| 1 | 26 | 24 | 46 |
| 2 | 27 | 25 | 47 |
| 3 | 28 | 26 | 48 |
+----+------------+----+----------+
对性能不太确定...因为为1,000,000条记录实现cte并为每个记录分配行号可能不是世界上最有效的方法...
Rextester Example使用100条带有间隔的记录将返回所有间隔为20的记录,将20调整为60,000相当简单,而20只是概念的证明。
现在我们有了起始和终止范围,我们可以获取有问题的60,000条记录。只需通过查询accountNumber在开始和结束之间的基表...通过交叉连接到CTE3,将其限制为仅1条记录...
注意: Does SQL Server TOP stop processing once it finds enough rows?似乎表明Top可能会在您第一次出现后就早早退出...但是我发现很难相信,因为必须执行命令...
因此必须进行测试才能知道最高或最高限制是否可以使查询受益。
其他尝试回答的问题随时可以利用创建的样本!
答案 1 :(得分:0)
在尝试上述答案之前,我发现了这一点,对我来说非常有用。谢谢大家!
答案 2 :(得分:0)
将sin(x):
cases x of:
[0, pi/2) -> calculate (Taylor or whatever)
[pi/2, pi) -> sin(pi - x)
[pi/2, 2pi) -> -sin(x - pi)
< 0 -> sin(-x)
>= 2pi -> sin(fmod(x, 2pi)) // floating-point remainder
与范围窗口子句一起使用,以查看account_number-59999及其自身范围内的行数。选择第一个完全计数为60000的数字,然后从表中进行选择。
cos