我有以下查询来查找MAX行之前的行。我觉得我错过了什么,有人可以帮忙。我正在向前看,将b.usercode_1作为a.usercode_1之前的行而不是min或任何其他随机行,而不是MAX之前的ROW。 请建议。
Select distinct
c.ssn
, c.controlled_group_Status CG_status
, c.last_name || ' , '|| c.first_name FULL_NAME
, a.usercode_1 Current_REG
, a.eff_date effective_since1
, b.usercode_1 PRIOR_REG
, b.eff_date effective_since2
, d.term_eff_date
from employee_eff_date c
, emp_cg_data a
, emp_cg_data b
, emp_ben_elects d
where c.control_id = 'XYZ'
and c.controlled_group_Status <> 'D'
and c.eff_date = (select max( c1.eff_date)
from emp_cg_data c1
where c.control_id = c1.control_id
and c.ssn = c1.ssn)
and a.control_id = c.control_id
and a.ssn = c.ssn
and a.eff_date = (select max(a1.eff_date )
from emp_cg_data a1
where a.control_id = a1.control_id
and a.ssn = a1.ssn)
and a.usercode_1 = 'REG26'
and b.control_id = c.control_id
and b.ssn = c.ssn
and b.eff_date = (select max( b1.eff_date)
from emp_cg_data b1
where b.control_id = b1.control_id
and b.ssn = b1.ssn
and b1.eff_date < a.eff_date)
and b.usercode_1 like 'REG%'
and d.control_id = c.control_id
and d.ssn = c.ssn
and d.life_event_date = (select max( d1.life_event_date)
from emp_ben_elects d1
where d.control_id = d1.control_id
and d.ssn = d1.ssn)
and d.le_seq_no= (select max( d1.le_seq_no)
from emp_ben_elects d1
where d.control_id = d1.control_id
and d.ssn = d1.ssn
and d.life_event_date = d1.life_event_date)
and d.term_eff_date is null
;
答案 0 :(得分:0)
注意:这不是一个完整的答案......这是一个有用的建议,你应该从什么开始。
你正在做四个表的笛卡尔积,用WHERE过滤......所以这样的东西
隐式连接 - 通常不是一种好的做法,因为将连接条件与连接条件区分开来可能非常困难。
SELECT *
FROM tableA a, TableB b
WHERE b.id = a.id
编写JOIN的另一种方式(更普遍接受的方式)
SELECT *
FROM tableA a
JOIN tableB b ON b.id = a.id
使用ON子句将两个表连接在一起。
您应该将联接更改为此格式,以便其他人可以阅读您的查询并更好地理解它。
解决问题的建议
获得倒数第二行的一种相当简单的方法是使用行计数器。
类似
SELECT *, @row_count := @row_count + 1
FROM tableA a
JOIN tableB b on b.id = a.id AND -- any other conditions for the join.
CROSS JOIN (SELECT @row_count := 0) t
然后从这里你可以获得MAX行,无论是ID还是别的。然后得到@row_num -1
。又名前一行。