Mysql - 复杂的查询给我带来问题

时间:2015-06-29 23:51:24

标签: mysql sql

我对这个查询非常困难。所以这个想法就是每年,faculty_id都会有一个等级和步骤值。根据一年中发生的情况,等级和步骤可能会也可能不会发生变化,它们彼此独立。步骤可能会改变,但等级可能保持不变,例如,反之亦然

+--------------------------+--------------+
| Field                    | Type         |
+--------------------------+--------------+
| id                       | int(11)      |
| year                     | smallint(6)  |
| faculty_id               | int(11)      |
| rank_id                  | smallint(6)  |
| step_code                | varchar(4)   |
+--------------------------+--------------+

现在,在过去的几个小时里,我一直在敲打砖墙的问题是:

我需要能够为特定year选择faculty_id。然后,我需要查看该年度的当前rankstep值,并输出他们在当前排名和步数值上停留的年数。

例如

+---------------------------------------
| 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知识水平。任何帮助将不胜感激。

编辑: 只是为了澄清,我在寻找一个人在排名和步骤上多久的时间里寻找连续性。如果他们是

一年排名

一年排名

再回到等级1 2年。

例如,当我为当年运行查询时......我只看到等级为1年级的排名1。在这个人排名第3的中间有一个休息时间,因此排名1的第一年不计入此查询。

1 个答案:

答案 0 :(得分:0)

使用给定的示例,可以执行以下操作:

select faculty_id, rank, step, count(id) as years
from table 
group by faculty_id, rank, step

作为您的排名'并且' step yr'看起来应该对我有同样的价值。 然而,这个查询并不会真正显示他们在排名中被困多少年,比如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条件,它将没有任何其他年份数据,然后它左边连接的下一个表将具有前一年的数据,如果它实际上共享相同的等级和步骤。而左边连接的第二个表仍然具有值,这意味着它至少连续2年,依此类推。因此,当结果为10时,它实际上意味着10 +。

可能有更好的解决方案,但这个可行。