迭代列以查找具有最后一个非零值的列
我有如下表work_sheet,
----------------------------------------------- Pid WeekendDate星期一星期二星期三星期五星期五星期六星期日 ---------------------------------------------- 11 14.10.2012 4 4 5 1 0 0 0 11 07.10.2012 2 2 1 5 3 0 0 12 07.10.2012 2 2 0 0 0 0 0 在这里,WeekendDate是“Sun”(最后一列)
我需要在logging最后一个非零值时find每个Pid的date。 所以我的结果应该是这样的
Pid LastValueDate 11 11.10.2012 12 02.10.2012 11 - > 11.10.2012是Thr(值1) 12 - > 02.10.2012是星期二(值2)
由于我的数据是在Excel中,我正在使用JDBC-ODBC连接。 我宁愿我们这可以用SQL来实现。
我的不完整的解决scheme(需要findlast_effort_day ):
selectpid ,max(WeekendDate) - (6- last_effort_day )AS end_date 从努力工作表 GROUP BY pid
请帮忙。
Try this select es.p_id,es.weekenddate-( CASE WHEN SUN != 0 THEN 0 WHEN SAT != 0 THEN 1 WHEN FRI != 0 THEN 2 WHEN THR != 0 THEN 3 WHEN WED != 0 THEN 4 WHEN TUE != 0 THEN 5 ELSE 6 END ) from( select p_id,max(weekenddate)dt from effort_sheet group by p_id )inner,effort_sheet es where inner.p_id =es.p_id AND inner.dt=es.weekenddate;
sqlfiddle链接
SELECT PID, Dateadd(DAY, -1 * ( CASE WHEN SUN != 0 THEN 0 WHEN SAT != 0 THEN 1 WHEN FRI != 0 THEN 2 WHEN THR != 0 THEN 3 WHEN WED != 0 THEN 4 WHEN TUE != 0 THEN 5 ELSE 6 END ), WEEKENDDATE) AS end_date FROM EFFORT_SHEET GROUP BY PID
SELECT Pid, MAX(WeekendDate) - (8 - MIN(CHARINDEX('0', CAST(Mon AS nvarchar(10) + CAST(Tue AS nvarchar(10)) + CAST(Wed AS nvarchar(10)) + CAST(Thr AS nvarchar(10)) + CAST(Fri AS nvarchar(10)) + CAST(Sat AS nvarchar(10)) + CAST(Sun AS nvarchar(10))))) AS last_effort_day FROM effort_sheet GROUP BY pid
我会开始使用这个联合查询,这是更容易操纵:
Select Pid, WeekendDate-6 As WeekDate, Mon As Num From effort_sheet Union Select Pid, WeekendDate-5 As WeekDate, Tue As Num From effort_sheet Union Select Pid, WeekendDate-4 As WeekDate, Wed As Num From effort_sheet
等等,每周的每一天。 那么你可以通过查询来使用一个组:
Select Pid, Max(WeekDate) From (the union select above) Where Num>0 Group By Pid
这是标准的SQL,应该与任何DBMS一起工作。
尝试这个:
select pid, max(case when mon = 0 then weekenddate - 7 when mon != 0 and tue = 0 then weekenddate - 6 when tue != 0 and wed = 0 then weekenddate - 5 when wed != 0 and thr = 0 then weekenddate - 4 when thr != 0 and fri = 0 then weekenddate - 3 when fri != 0 and sat = 0 then weekenddate - 2 when sat != 0 and sun = 0 then weekenddate -1 end) from effort_sheet group by pid