我有一个由库存项目组成的库存表。我具有以下表结构:

INSTALLATION_ID
COMPONENT_ID
HISTORY_ID
ON_STOCK
LAST_CHANGE


对于不存在特定的LAST_CHANGE月的记录,我需要获取具有最大HISTORY ID的行。

每个COMPONENT_ID和INSTALLATION_ID可以多次出现,它们通过各自的HISTORY_ID进行区分

例:

我有以下记录

COMPONENT_ID | INSTALLATION_ID | HISTORY_ID |最后一次变更

1 | 100 | 1 | 2013-01-02
1 | 100 | 2 | 2013-02-01
1 | 100 | 3 | 2013-04-09
2 | 100 | 1 | 2013-02-22
2 | 100 | 2 | 2013-03-12
2 | 100 | 3 | 2013-07-07
2 | 100 | 4 | 2013-08-11
2 | 100 | 5 | 2013-09-15
2 | 100 | 6 | 2013-09-29
3 | 100 | 1 | 2013-02-14
3 | 100 | 2 | 2013-09-23
4 | 100 | 1 | 2013-04-17


我现在尝试检索每个组件具有最大历史ID的行,但仅检索其中不存在指定月份的COMPONENT_ID的行

我尝试了以下方法:

SELECT

INVENTORY.COMPONENT_ID,
INVENTORY.HISTORY_ID

FROM INVENTORY

WHERE INVENTORY.HISTORY_ID = (SELECT
    MAX(t2.HISTORY_ID)
    FROM INVENTORY t2
    WHERE NOT EXISTS
    (
        SELECT *
        FROM INVENTORY t3
        WHERE MONTH(t3.LAST_CHANGE) = 9
        AND YEAR(t3.LAST_CHANGE)= 2013
        AND t3.HISTORY_ID = t2.HISTORY_ID
    )
)

AND INVENTORY.INSTALLATION_ID = 200
AND YEAR(INVENTORY.LAST_CHANGE) = 2013


该查询似乎具有正确的语法,但超时。

在这种情况下,我想检索所有组件的最大HISTORY_ID,除了那些在9月有记录的组件。

因为我需要按行月份完全排除行,所以我不能使用NOT IN,因为它们只会隐藏9月的记录,但是同一组件可能在另一个月份出现。

有人可以指点一下吗?非常感谢。

最佳答案

如果我正确理解了您想要的内容,可以这样做

SELECT component_id, MAX(history_id) history_id
  FROM inventory
 WHERE last_change BETWEEN '2013-01-01' AND '2013-12-31'
   AND installation_id = 100
 GROUP BY component_id
HAVING MAX(MONTH(last_change) = 9) = 0


输出:

| COMPONENT_ID | HISTORY_ID |
|--------------|------------|
|            1 |          3 |
|            4 |          1 |

If you always filter by installation_id and a year of last_change make sure that you have a compound index on (installation_id, last_change)

ALTER TABLE inventory ADD INDEX (installation_id, last_change);


这是SQLFiddle演示

关于mysql - MySQL-在不存在的月份中获取具有最大HISTORY ID的COMPONENT ID的行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19320897/

10-11 03:08