我有一个庞大的表,其中每月生成记录,结果用month_of
列标记。我需要每月比较这些month_of
结果集以找到新的激活(本月出现的新记录,上个月没有)
目标:从CURRENT MONTH获取一组结果,其中唯一ID中的上一个月不存在。
解释:
上个月(3月),我有10条记录标记状态=“活动”,月份为“MARCH”
这个月(4月),我有11条记录标记状态=“活动”,月份为“APRIL”
我已经尝试过这样的事情:如果ta1 =当前月份的报告,则ta2 =上个月的报告
SELECT id FROM table ta1
LEFT OUTER JOIN table ta2
ON ta1.status = ta2.status
WHERE ta1.month_of = #{current_month}
AND ta2.month_of = #{last_month}
AND ta1.status = 'ACTIVE'
AND ta2.id IS null
我需要的查询将返回带有month_of“APRIL”的1条新记录,该记录在month_of“MARCH”结果中不存在。
任何人都可以指出我正确的加入使用,以获得我正在寻找的东西?该解决方案将适用于具有近10亿条记录的表格。
选择ID 来自ta1 其中month_of =(current_month) 和id不在(从ta1中选择id,其中month_of =(last_month)) 和''活跃'中的状态
或者你可以这样做:
选择a.id. from(select id,month_of from ta1 where month_of =(current_month)and status ='Active' )一个 left join(从ta1中选择id,month_of,其中month_of =(last_month) )b on a.id!= b.id.
THIS ARTICLE对我理解连接以及如何使用它们非常有帮助。
我实际上最终使用LEFT OUTER JOIN
如下:
SELECT se1.id FROM service_effectivenesses se1
LEFT OUTER JOIN service_effectivenesses se2
ON se1.vehicle_id = se2.vehicle_id
AND se1.dealership_id = se2.dealership_id
WHERE se1.dealership_id = #{dealershio_id}
AND se2.id IS NULL
AND se1.month_of = DATE('#{month_of.strftime("%Y-%m-%d")}')
AND se2.month_of = DATE('#{month_of.strftime("%Y-%m-%d")}') - interval '1 month'
AND se1.status = 'ACTIVE'
#{}
变量来自我们的Rails应用程序,因此请忽略它们。