【发布时间】:2015-01-05 05:45:45
【问题描述】:
我想在我的表working 中计算NO_TOP_RATING 的值
NO_TOP_RATING 的计算由:
- 对于每一行,从该记录的
ANNDATS_CONVERTED获取属于上一年的所有其他行,并且与该记录具有相同的ESTIMID。 - 从中找出最低的
IRECCD值。 - 然后,计算相同
ANALYST的IRECCD与计算出的最低IRECCD匹配的次数。
注意:这应该忽略正在计算的当前行(因此要找到行 id 1 的值,请不要在计算中使用该行)以及 ANALYST 为空白的任何记录完全被忽略。
表working:
| ID | ANALYST | ESTIMID | ANNDATS_CONVERTED | IRECCD | NO_TOP_RATING |
---------------------------------------------------------------------------------
| 1 | DAVE | Brokerage000 | 1998-07-01 | 2 | |
| 2 | DAVE | Brokerage000 | 1998-06-28 | 2 | |
| 3 | DAVE | Brokerage000 | 1998-07-02 | 4 | |
| 4 | DAVE | Brokerage000 | 1998-07-04 | 3 | |
| 5 | SAM | Brokerage000 | 1998-06-14 | 1 | |
| 6 | SAM | Brokerage000 | 1998-06-28 | 4 | |
| 7 | | Brokerage000 | 1998-06-28 | 1 | |
| 8 | DAVE | Brokerage111 | 1998-06-28 | 5 | |
所以 - 在为 记录 #1 计算 NO_TOP_RATING 时:
- 记录 #1 将不包含在计算中,因为我想从计算中省略它
-
记录 #7 将不完全包含在计算中,因为
ANALYST为空白 -
记录 #8 将不包含在计算中,因为
ESTIMID与记录 #1 不同
预期结果:
表working:
| ID | ANALYST | ESTIMID | ANNDATS_CONVERTED | IRECCD | NO_TOP_RATING |
---------------------------------------------------------------------------------
| 1 | DAVE | Brokerage000 | 1998-07-01 | 2 | 0 |
| 2 | DAVE | Brokerage000 | 1998-06-28 | 2 | 0 |
| 3 | DAVE | Brokerage000 | 1998-07-02 | 4 | 0 |
| 4 | DAVE | Brokerage000 | 1998-07-04 | 3 | 0 |
| 5 | SAM | Brokerage000 | 1998-06-14 | 1 | 0 |
| 6 | SAM | Brokerage000 | 1998-06-28 | 4 | 1 |
| 7 | | Brokerage000 | 1998-06-28 | 1 | |
| 8 | DAVE | Brokerage111 | 1998-06-28 | 5 | 0 |
这是我目前拥有的 MySQL:
UPDATE `working`
SET `working`.`NO_TOP_RATING` =
(
SELECT COUNT(`ID`) FROM (SELECT `ID`,`IRECCD`,`ESTIMID` FROM `working`) AS BB
WHERE
`IRECCD` =
(
SELECT COUNT(`ID`) FROM (SELECT `ID`,`IRECCD`,`ESTIMID`, `ANALYST` FROM `working`) AS ZZ
WHERE
`IRECCD` =
-- this calculates the LOWEST number with same `ESTIMID`
(
SELECT MIN(`IRECCD`)
FROM (SELECT `ID`,`IRECCD`,`ANNDATS_CONVERTED`,`ESTIMID` FROM `working`) AS CC
WHERE
`ANNDATS_CONVERTED` >= DATE_SUB(`ANNDATS_CONVERTED`,INTERVAL 1 YEAR)
AND
`working`.`ESTIMID` = BB.`ESTIMID`
)
-- END this calculates the LOWEST number with same `ESTIMID`
AND
`working`.`ANALYST` = ZZ.`ANALYST`
)
)
WHERE `working`.`ANALYST` != ''
这是在 PHP 中工作的,循环遍历每个记录并评估每个记录的所有其他记录。这涉及循环并在大型数据库上花费很长时间。我正在尝试使用 MySQL 实现相同的结果。
【问题讨论】:
-
您能否编辑您的问题以包含您共享的示例数据的预期结果?
-
还是有些混乱。例如,您想要在日期之后 还是在 日期之前一年内的行?因此,在计算第 1 行的值时,是否应该包括第 2 行,因为它发生在第 1 行之前?
-
谢谢@McAdam331。合格年份应 >= -1 年过去
ANNDATS_CONVERTED。所以一年前,直到ANNDATS_CONVERTED。是 - 将包括第 2 行,因为它等于或大于 1 年前。 -
是的@McAdam331 我将编辑问题以显示预期结果。谢谢您的帮助。问候。
-
谢谢。我有一个查询的想法,但我想确保答案是正确的。