0

我有三个表,一个对象表、一个状态表和一个状态类型表。

一个对象有多个状态',每个状态都有一个状态类型。我想创建一个视图,为我提供对象ID和 StatusTypes 表中最重要的状态描述,以及状态表中最重要的状态Date

我挂断的部分是找到最重要的状态它必须首先按最新日期排序,然后按状态表中的整数权重(优先级),然后再次按状态类型表中的另一个权重(权重

什么是快速交付这些结果的最佳 SQL 语句。

对象

ID  Aquisiton Date  Serial Number
127237  1997-04-21  2151513515
127239  1997-10-31  2151513523
127242  1998-01-20  2165588481
127272  1998-10-20  2195689842
127286  1999-06-15  2231549489
127291  1999-06-01  2229564978

地位

ID  ObjectID    Priority    StatusMessage   Date                Status
1   127237         1        Online          22.02.12 07.01.00   1
2   127237         3        Job Received    22.02.12 07.01.00   3
3   127237         5        Job Started     22.02.12.07.01.00   3
4   127237         5        Jam             22.02.12.07.01.00   2
5   127286         1        Online          22.02.12.07.09.00   1   

状态类型

ID  Description Weighting
1   Idle        0
2   Error       9
3   Working     5

预期输出##

ID      Status      Date        
127237  Error       22.02.12 07.01.00
127286  Idle        22.02.12.07.09.00   
4

1 回答 1

0

听起来你可以使用ROW_NUMBER()

SELECT *
FROM (SELECT *,ROW_NUMBER() OVER(PARTITION BY ID ORDER BY Date DESC, Priority, Weighting) 'RowRank'
      FROM YourTable a
     )sub
WHERE RowRank = 1

显然替换YourTable为相关JOIN

该 ROW_NUMBER() 函数为每一行分配一个数字。 PARTITION BY 是可选的,但用于为该组中的每个值重新开始编号,即:如果您PARTITION BY ID 为每个唯一 ID 值重新编号,则编号将从 1 开始。 ORDER BY当然用于定义计数应该如何进行,并且是必需的在ROW_NUMBER()函数中。

使用您的数据更新:

SELECT ObjectID,Description,Date
FROM (SELECT a.*,b.Description,ROW_NUMBER() OVER(PARTITION BY a.ObjectID ORDER BY CONVERT(DATE,LEFT([Date],8),4) DESC, Priority DESC, Weighting DESC) 'RowRank'
      FROM Status a
      JOIN Status_Types b
        ON a.Status = b.ID
     )sub
WHERE RowRank = 1

演示: SQL 小提琴

于 2013-09-09T23:19:43.733 回答