变体使用GROUP BY的在TSQL条款(Variant use of the GROUP BY c

2019-09-21 01:58发布

想象一下下面的架构和样本数据(SQL Server 2008中):

OriginatingObject
----------------------------------------------
ID
1
2
3

ValueSet
----------------------------------------------
ID   OriginatingObjectID   DateStamp
1    1                     2009-05-21 10:41:43
2    1                     2009-05-22 12:11:51
3    1                     2009-05-22 12:13:25
4    2                     2009-05-21 10:42:40
5    2                     2009-05-20 02:21:34
6    1                     2009-05-21 23:41:43
7    3                     2009-05-26 14:56:01

Value
----------------------------------------------
ID   ValueSetID   Value
1    1            28
etc (a set of rows for each related ValueSet)

我需要获得最新的ValueSet记录每个OriginatingObject的ID。 不要假设更高记录的ID,最近的是。

我不知道如何使用GROUP BY正确,以确保设置组合在一起,形成各集聚行的结果包括该行与该分组的最高值日期戳的ID。 我是否需要使用子查询,或是否有更好的办法?

Answer 1:

您可以使用相关子查询或者使用具有多个列和GROUP-BY做到这一点。

请注意,简单GROUP-BY只能给你带来OriginatingIDs和时间戳列表。 为了拉动相关ValueSet标识,最干净的解决方案是使用子查询。

多列在GROUP-BY(可能更快):

SELECT O.ID, V.ID
FROM Originating AS O, ValueSet AS V
WHERE O.ID = V.OriginatingID
AND
(V.OriginatingID, V.DateStamp) IN
(
    SELECT OriginatingID, Max(DateStamp)
    FROM ValueSet
    GROUP BY OriginatingID
)

相关子查询:

SELECT O.ID, V.ID
FROM Originating AS O, ValueSet AS V
WHERE O.ID = V.OriginatingID
AND
V.DateStamp =
(
    SELECT Max(DateStamp)
    FROM ValueSet V2
    WHERE V2.OriginatingID = O.ID
)


Answer 2:

SELECT OriginatingObjectID, id
FROM (
    SELECT id, OriginatingObjectID, RANK() OVER(PARTITION BY OriginatingObjectID 
                                    ORDER BY DateStamp DESC) as ranking
    FROM ValueSet)
WHERE ranking = 1;


Answer 3:

这可以用相关子查询来完成。 无必要GROUP-BY。

SELECT
  vs.ID,
  vs.OriginatingObjectID,
  vs.DateStamp,
  v.Value
FROM
  ValueSet vs
  INNER JOIN Value v ON v.ValueSetID = vs.ID 
WHERE
  NOT EXISTS (
    SELECT 1 
    FROM   ValueSet 
    WHERE  OriginatingObjectID = vs.OriginatingObjectID 
           AND DateStamp > vs.DateStamp
  )

这仅如果不能在ValueSet表OriginatingObjectID两个相等的日戳。



文章来源: Variant use of the GROUP BY clause in TSQL