ROW在MAX行之前,而不是MIN

时间:2014-07-28 14:02:34

标签: mysql

我有以下查询来查找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      
;

1 个答案:

答案 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。又名前一行。