我对这个查询感到非常困难。因此,这个想法是,每年,faculty_id 都会填充排名和步长值。根据一年中发生的情况,排名和级别可能会也可能不会改变,并且它们是相互独立的。例如,步数可能会改变,但排名可能保持不变,反之亦然
+--------------------------+--------------+
| Field | Type |
+--------------------------+--------------+
| id | int(11) |
| year | smallint(6) |
| faculty_id | int(11) |
| rank_id | smallint(6) |
| step_code | varchar(4) |
+--------------------------+--------------+
过去几个小时里我一直在用头撞砖墙的查询是这样的:
我需要能够为特定的faculty_id
选择年份
。然后,我需要查看当年的当前排名和步长值,并输出它们在当前排名和步长值上停留了多少年。
例如
+---------------------------------------
| id | year | faculty_id | rank | step |
----------------------------------------
| 1 | 2005 | 1 | 1 | I |
| 2 | 2006 | 1 | 2 | II |
| 3 | 2007 | 1 | 3 | III |
| 4 | 2008 | 1 | 3 | III |
| 5 | 2009 | 1 | 3 | IV |
| 6 | 2007 | 2 | 5 | III |
| 7 | 2008 | 2 | 5 | III |
| 8 | 2009 | 2 | 6 | III |
----------------------------------------
Year = 2009
+-----------------------------------------------
| faculty_id | rank | step | rank yr | step yr |
------------------------------------------------
| 1 | 3 | IV | 3 | 1 |
| 2 | 6 | III | 1 | 3 |
------------------------------------------------
Year = 2008
+-----------------------------------------------
| faculty_id | rank | step | rank yr | step yr |
------------------------------------------------
| 1 | 3 | III | 2 | 2 |
| 2 | 5 | III | 2 | 2 |
------------------------------------------------
鉴于目前的情况,无法以编程方式执行此操作,需要提取报告,但源代码当前不可用。我自己尝试做这件事毫无进展,这超出了我的 SQL 知识水平。任何帮助将不胜感激。
编辑: 需要澄清的是,当我查看一个人在职级和级别的时间时长时,我正在寻找多年来的连续性。如果他们是
连续多年排名第一
连续一年排名第3
连续 2 年重返排名 1。
例如,当我运行当前年份的查询时...我只看到排名 1 @ 2 年的排名。中间有一个中断,此人排名 3,因此排名 1 的第一年不会计入此查询。
最佳答案
对于给定的示例,可以执行以下操作:
select faculty_id, rank, step, count(id) as years
from table
group by faculty_id, rank, step
因为你的“排名年”和“步数年”的外观对我来说应该始终具有相同的值(value)。 然而,这个查询不会真正显示他们在某个排名中停留了多少年,假设 2005 年他们排名第 5,然后接下来的两年他们排名第 6,但再次降级到排名 5,查询将计算这些排名排名第 5 的年份为两年,但不是连续的。如果您需要类似的东西,它可能会更复杂。
编辑:
好吧,我知道这看起来很愚蠢,而且不太好,但它应该可以为您解决问题,并覆盖 10 年继续相同的等级和步骤:
select QueryYear.faculty_id, QueryYear.rank, QueryYear.step,
Case When Tminus9.faculty_id IS NOT NULL THEN 10
ELSE Case When Tminus8.faculty_id IS NOT NULL THEN 9
ELSE Case When Tminus7.faculty_id IS NOT NULL THEN 8
ELSE Case When Tminus6.faculty_id IS NOT NULL THEN 7
ELSE Case When Tminus5.faculty_id IS NOT NULL THEN 6
ELSE Case When Tminus4.faculty_id IS NOT NULL THEN 5
ELSE Case When Tminus3.faculty_id IS NOT NULL THEN 4
ELSE Case When Tminus2.faculty_id IS NOT NULL THEN 3
ELSE Case When Tminus1.faculty_id IS NOT NULL THEN 2
ELSE 1 END
from table QueryYear
left join table Tminus1 on Tminus1.faculty_id = QueryYear.faculty_id and QueryYear.rank = Tminus1.rank and QueryYear.step = Tminus1.step and QueryYear.year = Tminus1.year + 1
left join table Tminus2 on Tminus2.faculty_id = QueryYear.faculty_id and QueryYear.rank = Tminus2.rank and QueryYear.step = Tminus2.step and QueryYear.year = Tminus2.year + 2
left join table Tminus3 on Tminus3.faculty_id = QueryYear.faculty_id and QueryYear.rank = Tminus3.rank and QueryYear.step = Tminus3.step and QueryYear.year = Tminus3.year + 3
left join table Tminus4 on Tminus4.faculty_id = QueryYear.faculty_id and QueryYear.rank = Tminus4.rank and QueryYear.step = Tminus4.step and QueryYear.year = Tminus4.year + 4
left join table Tminus5 on Tminus5.faculty_id = QueryYear.faculty_id and QueryYear.rank = Tminus5.rank and QueryYear.step = Tminus5.step and QueryYear.year = Tminus5.year + 5
left join table Tminus6 on Tminus6.faculty_id = QueryYear.faculty_id and QueryYear.rank = Tminus6.rank and QueryYear.step = Tminus6.step and QueryYear.year = Tminus6.year + 6
left join table Tminus7 on Tminus7.faculty_id = QueryYear.faculty_id and QueryYear.rank = Tminus7.rank and QueryYear.step = Tminus7.step and QueryYear.year = Tminus7.year + 7
left join table Tminus8 on Tminus8.faculty_id = QueryYear.faculty_id and QueryYear.rank = Tminus8.rank and QueryYear.step = Tminus8.step and QueryYear.year = Tminus8.year + 8
left join table Tminus9 on Tminus9.faculty_id = QueryYear.faculty_id and QueryYear.rank = Tminus9.rank and QueryYear.step = Tminus9.step and QueryYear.year = Tminus9.year + 9
where QueryYear.year = 2009
group by faculty_id, rank, step
通过在 QueryYear 表上给定一个 where 条件,它不会有任何其他年份数据,然后它离开的下一个表如果实际上共享相同的排名和步长,则将具有上一年的数据。如果左连接的第二个表仍然有值(value),则意味着它至少持续了 2 年,依此类推。因此,当结果为 10 时,它实际上意味着 10+。
可能有更好的解决方案,但这个可行。
关于Mysql - 复杂的查询给我带来了问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31127383/