查找数字是否始终按顺序增加

时间:2015-02-02 13:11:17

标签: mysql sql algorithm sequence

我有一张表,列中有2个感兴趣:

external_id unsigned int
processed_date date

我希望external_id与processed_date一起增加。但是我怎么验证呢? 我尝试使用笛卡尔积,如:

select * from tableA as a , tableA as b
where a.external_id > b.external_id and a.processed_date < b.processed_date

但完成时间太长了。

有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

由于这是一次性项目,您可以创建一个包含行号的临时表,然后执行仅将行N与行N+1进行比较的查询(并依赖{的传递性对于所有其他行{1}}:

<

SET @row_num:=0; INSERT INTO my_temp (row_number, proc_date, ext_id) SELECT @row_num:=@row_num+1 as row_number , proc_date , ext_id FROM original_table ORDER BY proc_date 到位后,您可以像这样搜索:

row_number

此查询的技巧是识别表中按SELECT * FROM my_temp a JOIN my_temp b ON a.row_number = b.row_number+1 WHERE a.ext_id >= b.ext_id 升序排序的下一行。但这正是proc_date的含义。您可能需要在row_number+1上创建索引,或者将其声明为唯一键,以便在合理的时间内完成此查询。

  

我有兴趣大致了解它发生的频率。

我会在混合SQL / Java解决方案中使用它(或者使用您喜欢的任何其他语言)。第一,将日期订购的外部ID单独加载到主存储器中,即

row_number

然后我会使用O(N * LogN)算法来计算inversions的数量。这是an implementation in Java