题目链接:点击打开链接
题目大意:略。
解题思路:略。
AC 代码
--解决方案(1) selectId, AccMonthasMonth, sum(Salary) asSalaryfrom( selecta.IdasId, a.MonthasAccMonth, b.MonthasMonth, b.SalaryasSalaryfrom ( selectEmployee.IdasId, Employee.MonthasMonthfromEmployee, (selectId, max(Month) asMonthfromEmployeegroupbyId) asLastMonthwhereEmployee.Id=LastMonth.IdandEmployee.Month!=LastMonth.Month) asajoinEmployeeasbona.Id=b.Idanda.Month-b.Month<=2anda.Month-b.Month>=0) asaccgroupbyId, AccMonthorderbyId, Monthdesc; --解决方案(2) SELECTE1.id, E1.month, (IFNULL(E1.salary, 0) +IFNULL(E2.salary, 0) +IFNULL(E3.salary, 0)) ASSalaryFROM (SELECTid, MAX(month) ASmonthFROMEmployeeGROUPBYidHAVINGCOUNT(*) >1) ASmaxmonthLEFTJOINEmployeeE1ON (maxmonth.id=E1.idANDmaxmonth.month>E1.month) LEFTJOINEmployeeE2ON (E2.id=E1.idANDE2.month=E1.month-1) LEFTJOINEmployeeE3ON (E3.id=E1.idANDE3.month=E1.month-2) ORDERBYidASC , monthDESC; --解决方案(3) WITHt1AS( SELECTe1.IdId1, e1.MonthMonth1, e2.MonthMonth2, e3.MonthMonth3, IFNULL(e1.Salary, 0) +IFNULL(e2.Salary, 0) +IFNULL(e3.Salary, 0) SalaryFROMEmployeee1LEFTJOINEmployeee2ONe1.Id=e2.IdANDe1.Month=e2.Month+1LEFTJOINEmployeee3ONe2.Id=e3.IdANDe2.Month=e3.Month+1), t2AS(SELECTId1, Month1, Month2, Month3, Salary, ROW_NUMBER() OVER(PARTITIONBYId1ORDERBYId1, IFNULL(Month1, IFNULL(Month2, Month3)) DESC) rkFROMt1) SELECTId1id, Month1month, SalaryFROMt2WHERErk<>1