一些 T-SQL 的帮助将不胜感激。
我有以下四个表:
- 项目(ID)
- ItemVersion(Id,FK 多对一 Item.Id)
- ItemVersionStatusLog (LogDate, FK 多对一 ItemVersion.Id, FK 多对一 StatusType.Id)
- 状态类型(ID、别名)
我只列出了适合这个问题的列。
根实体是一个Item
. 对于每个Item
,都有一个或多个ItemVersion
条目。对于每个ItemVersion
条目,有一个或多个ItemVersionStatusLog
条目带有日期和对 a 的引用StatusType
(例如,创建、更新、禁用)。
我想Item
通过在一个新表(ItemStatus
对于每个项目和 StatusType
对,聚合应该为我提供日志表中的最大日期条目。这样我就有了一个快照,对于每个StatusType
,我可以获得ItemVersion
一个项目的最新信息。
另一种说法是程序上:
For each Item
- For each StatusType
- - List the ItemVersion Id with the maximum date from ItemVersionStatusLog given the correct StatusType
我的聚合视图或表的目标列是:
Item Id, ItemVersion Id, Date (from ItemVersionStatus), StatusType Id
虽然使用 UDF 可以很好地做到这一点,但如果可能的话,我希望在单个 SQL 语句中做到这一点。我的主要目标是 SQL Server 2008,但也没有太多修改的 SQL Server Compact 4,所以依赖 UDF 不是一个很好的选择,但感谢任何帮助:)
更新 - 一些示例数据
Item:
Id
--
1
2
项目版本:
Id | ItemId | Name
----------
1 | 1 | Apple
2 | 1 | Orange
3 | 1 | Plum
4 | 2 | Petrol
5 | 2 | Diesel
6 | 2 | LPG
状态类型:
Id | Alias
-----------
1 | Created
2 | Approved
3 | Published
4 | Deleted
项目版本状态日志:
Id | ItemVersionId | StatusTypeId | Date
------------------------------------------
1 | 1 | 1 | 2012-01-01 00:00
2 | 1 | 4 | 2012-01-01 00:05
3 | 2 | 1 | 2012-01-01 00:10
4 | 2 | 3 | 2012-01-01 00:15
5 | 3 | 1 | 2012-01-01 00:20
6 | 3 | 3 | 2012-01-01 00:25
在这种情况下,第 1 项的预期结果将是:
项目状态
ItemId | ItemVersionId | Date | StatusTypeId
--------------------------------------------------------
1 | 3 | 2012-01-01 00:20 | 1
1 | 3 | 2012-01-01 00:25 | 3
1 | 1 | 2012-01-01 00:05 | 4