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

标签 mysql sql

我对这个查询感到非常困难。因此,这个想法是,每年,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/

相关文章:

Mysql - 插入 N'...'

sql - 将存储过程输入参数分配给局部变量是否有助于优化查询?

sql - 取消嵌套列时无法在 Presto 上转换为数组 (varchar)

sql - 时态查询和非时态查询有什么区别

SQL Server 静默截断存储过程中的 varchar

PHP/mysql 我的代码有什么问题,它插入到了错误的列

.net - VB.net - 从 mysql 数据库直接插入/检索图片到/从 Picturebox

MySQL 授予数据库除一张表之外的所有权限

php - MySQL 连接不工作 Ubuntu?

mysql - 查询如何工作,选择以 % 结尾的任何名称