Sql 确定保存特定信息的记录;“国家”;在指定日期

Sql 确定保存特定信息的记录;“国家”;在指定日期,sql,state-machine,Sql,State Machine,我有一个状态机架构,其中一个记录将有许多状态转换,其中最大的sort_key列是当前状态。我的问题是确定哪些记录在给定日期内保存了特定状态(或多个状态) 示例数据: items table id 1 item_transitions table id item_id created_at to_state sort_key 1 1 05/10 "state_a" 1 2 1 05/12

我有一个状态机架构,其中一个记录将有许多状态转换,其中最大的
sort_key
列是当前状态。我的问题是确定哪些记录在给定日期内保存了特定状态(或多个状态)

示例数据:

items table
id 
1

item_transitions table
id   item_id   created_at    to_state     sort_key
1      1          05/10      "state_a"       1
2      1          05/12      "state_b"       2
3      1          05/15      "state_a"       3
4      1          05/16      "state_b"       4
问题:

items table
id 
1

item_transitions table
id   item_id   created_at    to_state     sort_key
1      1          05/10      "state_a"       1
2      1          05/12      "state_b"       2
3      1          05/15      "state_a"       3
4      1          05/16      "state_b"       4
确定2015年5月5日状态为“状态a”的
项目
表中的所有记录。这显然应该返回示例数据中的项目,但如果您使用日期“05/16”进行查询,则不应该返回


我假设我将使用一个
左外部联接
将items\u transitions表联接到自身,并缩小可能性,直到我有可以查询的东西,它将提供我需要的项目。也许我忽略了更简单的问题。

你的问题重新表述的意思是“给我所有在2015年5月5日或之前更改为状态a,但之后未更改为另一状态的项目。请注意,在这个例子中,它添加了2001年以获得有效日期。如果你的“在“列不是日期时间,我强烈建议更改它

因此,首先可以检索阈值日期之前所有项目的最后一个排序密钥:

SELECT item_id,max(sort_key) last_change_sort_key
FROM item_transistions it
WHERE created_at<='05/15/2001'
GROUP BY item_id
选择项目id、最大值(排序键)上次更改排序键
从项目_传输它

其中创建了从项目创建的转换,其中创建的转换='05/15'和到的转换='state_a',如果转换是在05/15创建的,而另一个转换直到05/20才创建,那么当您查询05/18时,您希望返回的是从05/15创建的转换。问题是确定在给定日期“进行”特定转换的项,而不是在给定日期“进行”转换的记录。您使用的是哪种DBMS?神谕博士后?
SELECT DISTINCT it.item_id
FROM item_transistions it
   JOIN (SELECT item_id,max(sort_key) last_change_sort_key
         FROM item_transistions it
         WHERE created_at<='05/15/2001'
         GROUP BY item_id) tmp ON it.item_id=tmp.item_id AND it.sort_key=tmp.last_change_sort_key
WHERE it.to_state='state_a'