获取5的倍数范围内的记录

时间:2015-11-22 04:47:34

标签: mysql view

我有一个新的week_table -

起始日期END_DATE weekno
---------------------------------------- ------
1996-01-01 1996年1月5日1
1996年1月8日1996年1月12日2
1996年1月15日1996年1月19日3
1996年1月22日1996年1月26日4
“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“” “”“”“”“”“”“”“”直到
1998年12月21日1998年12月26日156

我正在尝试提取组中5周的记录。我正在看结果如

起始日期END_DATE weekno_start weekno_end
--------------------------------------- -------
1996-01-01 1996年2月2日1 5
1996年2月5日1996年3月8日6 10
1996年3月11日1996年4月12日11月16日

我确实得到了结果,但是周数字一直在数据库中的最大周数运行。对于在weekno 156上的记录,我获得了具有空值的行。

如何避免使用null的记录并将视图限制为最大周数

我目前的代码是 -

SELECT (t1.weekno * 5) - 4 AS start_id
    ,t3.start_date
    ,t4.end_date
    ,(t1.weekno * 5) AS end_id
FROM weekcon_table t1
LEFT JOIN weekcon_table t2 ON (t2.weekno = t1.weekno * 5)
LEFT JOIN weekcon_table t3 ON (t3.weekno = (t1.weekno * 5) - 4)
LEFT JOIN weekcon_table t4 ON (t4.weekno = (t1.weekno * 5))

3 个答案:

答案 0 :(得分:1)

你有没有试过这样的事情:

select   min(weekno) as `start_id`,
         min(start_date) as `start_date`, 
         max(end_date) as `end_date`, 
         min(weekno) as `weekno_start`,
         max(weekno) as `weekno_end`
from weekcon_table 
group by ((weekno - 1) DIV 5)
order by ((weekno - 1) DIV 5) asc

这是输出:

start_id    start_date  end_date    weekno_start    weekno_end
1   01/01/1996  26/01/1996  1   5
6   04/03/1996  24/02/1996  6   10
11  01/04/1996  30/03/1996  11  15
16  06/05/1996  27/04/1996  16  20
21  03/06/1996  25/05/1996  21  23
 Record Count: 5; Execution Time: 1ms View Execution Plan  link

答案 1 :(得分:0)

我创建了两个表并指定了View Device Logs

第一个是rank_id ...将是每行star_date

第二个表适用于weekno % 5 = 1 ...每行end_date,还包括所有周的最后日期。

然后按weekno % 5 = 0

加入

Sql Fiddle Demo 在演示中,如果想了解正在发生的事情,您可以更改rank_id的{​​{1}}字段

select

<强>输出

*

答案 2 :(得分:0)

我找到了另一个解决方案

<强> SQL Fiddle Demo

SELECT *
FROM t_week w_ini
JOIN t_week w_end
   ON w_ini.weekno = w_end.weekno + 4 
   OR w_ini.weekno + 5 >  w_end.weekno 
WHERE 
    w_ini.weekno % 5 = 1
and w_ini.weekno < w_end.weekno
and( 
   w_end.weekno % 5 = 0 or
   w_end.weekno = (SELECT max(weekno) FROM t_week)
  )