我有一张表,列中有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
但完成时间太长了。
有更好的方法吗?
答案 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。