sql大数据自关联查询优化

  1. 一张表a,字段有date(日期),city(城市),area(区域),cl(期初人口数量),ml(期末人口数量),zl(增加的人口数量)
  2. 只有当天zl有变动的时候才会有数据,如果不变动,则当天不记录
  3. 表内容示例:
  4. date city area cl ml zl
  5. 2018-05-01 cc1 a11 100 99 -1
  6. 2018-05-02 cc1 a12 200 205 5
  7. 2018-05-02 cc2 a21 50 100 50
  8. 2018-05-03 cc1 a11 99 140 51
  9. 要查每一个区域的一定时间范围内的期初数量和期末数量,例:查2018-05-01至2018-05-03,cc1-a11的期初是100.期末是140,cc1-a12的期初是200,期末是205,cc2-a21的期初是50,期末是100
  10. 找到两种方式查期初和期末:一是取最小日期和最大日期所在的日期,据日期取找值;二是自关联。目前因为数据量到2千万,查询速度很慢,寻找优化方案
  11. 在线等,着急,谢谢!

我觉得应该把数据预先关联起来,查询的时候能够自动的遍历。速度能得到比较明显的提升。

这种场景,就不适合数据库了,建议你用Neo4J,它专门是解决这种大量的关联的存储的。

建表的时候有建索引吗

select dt,CITY,AREA,cl,ml,zl,min(dt)over(partition by CITY,AREA) cdt,max(dt)over(partition by CITY,AREA) mdt ,
case when max(dt)over(partition by CITY,AREA)-min(dt)over(partition by CITY,AREA)=0 then cl end one_cl,
case when max(dt)over(partition by CITY,AREA)-min(dt)over(partition by CITY,AREA)=0 then ml end one_ml,
case when max(dt)over(partition by CITY,AREA)-min(dt)over(partition by CITY,AREA)>0 and min(dt)over(partition by CITY,AREA)=dt then cl end deff_cl,
case when max(dt)over(partition by CITY,AREA)-min(dt)over(partition by CITY,AREA)>0 and max(dt)over(partition by CITY,AREA)=dt then ml end deff_ml
from rk_test

1   2018-05-02  cc2 a21 50  100 50  2018-05-02  2018-05-02  50  100     
2   2018-05-01  ccl a11 100 99  -1  2018-05-01  2018-05-03          100 
3   2018-05-03  ccl a11 99  140 51  2018-05-01  2018-05-03              140
4   2018-05-02  ccl a12 200 205 5   2018-05-02  2018-05-02  200 205