我的表中有4 columns(date,gr1,gr2,gr3)
个(gr)
列,其等级范围为(a到f)。
date gr1 gr2 gr3
2012-1-1 a b c
2011-11-31 b d c
2011-11-30 c a f
2011-11-29 a b f
2011-11-28 f b c
2011-11-27 a c d
2011-11-26 c a b
我需要查询以下内容: 我需要选择当任何列值在第二天具有'a'后跟'f'成绩时,无论哪个列具有等级。
我是新手,非常感谢任何帮助......祝大家新年快乐!
答案 0 :(得分:1)
进行比较时,一种方法是将记录一起比较到同一行。由于您要比较“当前日期与当天日期”中的记录,因此您可以将表格加入到自身中,并且日期相差一天。这是通过DATEDIFF
函数完成的,该函数计算两个日期之间的天数。
查询1 :
select
today.*,
followingday.date as ndate, followingday.gr1 as ngr1,
followingday.gr2 as ngr2, followingday.gr3 as ngr3
from mytable today
join mytable followingday on DATEDIFF(followingday.date, today.date) = 1
这将给出以下结果,连续日值与前一天相结合(我已使用前缀followingday
重命名n
中的列,以便所有列都具有唯一名称,否则它们不会全部显示在结果集中):
结果(DEMO):
| DATE | GR1 | GR2 | GR3 | NDATE | NGR1 | NGR2 | NGR3 |
------------------------------------------------------------------------------------------------------------
| November, 30 2011 00:00:00+0000 | c | a | f | December, 01 2011 00:00:00+0000 | b | d | c |
| November, 29 2011 00:00:00+0000 | a | b | f | November, 30 2011 00:00:00+0000 | c | a | f |
| November, 28 2011 00:00:00+0000 | f | b | c | November, 29 2011 00:00:00+0000 | a | b | f |
| November, 27 2011 00:00:00+0000 | a | c | d | November, 28 2011 00:00:00+0000 | f | b | c |
| November, 26 2011 00:00:00+0000 | c | a | b | November, 27 2011 00:00:00+0000 | a | c | d |
现在结果合并为一行,我们可以对数据应用一些逻辑。在这种情况下,规则是“任何列值在第二天都有'a'后跟'f'等级,无论哪个列都有等级。”因此,当天任何成绩均为a
,其次是第二天f
成绩为...
where (today.gr1 = 'a' or today.gr2 = 'a' or today.gr3 = 'a')
and (followingday.gr1 = 'f' or followingday.gr2 = 'f' or
followingday.gr3 = 'f')
:
查询2 :
| DATE | GR1 | GR2 | GR3 | NDATE | NGR1 | NGR2 | NGR3 |
------------------------------------------------------------------------------------------------------------
| November, 29 2011 00:00:00+0000 | a | b | f | November, 30 2011 00:00:00+0000 | c | a | f |
| November, 27 2011 00:00:00+0000 | a | c | d | November, 28 2011 00:00:00+0000 | f | b | c |
结果(DEMO):
a
结果显示11-27-11
上的成绩为f
,其后11-28-11
成绩为a
。同样,11-29-11
上的成绩为f
,11-30-11
上的成绩为{{1}}。这些应该是满足规则的唯一结果。