如何确保查询结果是连续的

时间:2019-10-23 17:14:40

标签: sql

我想查询一个具有帐号的表,但是我需要一个从任意数字开始的60000的连续范围,只要它是连续的就没有关系。

我什么都没想,我只是查询之间有一个基本的方法,但这甚至不好,因为我不想或不需要指定开始,只需要顺序范围即可。

Select *
From tableA
where account number between acctNum1 and acctNum2;

连续60000个帐号。

因此,如果有1到1百万个帐号,并且帐号中存在随机间隔,我想看看能否得到60000个但连续的数量。

3 个答案:

答案 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 |
+----+------------+----+----------+
  • 将SrcTable调整为具有accountNUmber的表
  • 假设AccountNumber实际上是数字,您表示从1开始,然后从那里开始依次增加1 ...
  • 假设您具有潜在客户窗口功能/分析功能。

对性能不太确定...因为为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)

在尝试上述答案之前,我发现了这一点,对我来说非常有用。谢谢大家!

Find ranges from a series of numbers in SQL/Oracle

答案 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