跨多个联接分组

时间:2013-09-10 07:34:31

标签: sql-server-2008 join group-by

以下查询返回包含列FM.FaultIDMSTR的多个值的数据,我想消除重复并只获取一个值并显示该值的其他数据。

Select TOP 1000 
  FH.AtmKey,F.FAULTDESC,FH.FAULTSTARTTIME,FH.FAULTENDTIME,FM.FaultIDMSTR
From FAULTS_HISTORY FH, FAULTDEFS F, FAULTMAP FM 
where FH.FaultID = F.FAULTID
and F.FAULTID = FM.FaultID
and FH.AtmKey in ('11487676154140993')

enter image description here

消除重复的条件将基于从FH.FAULTSTARTTIME列派生的较大值。

我不确定如何使用多个连接实现此级别的分组,这是我的查询

1 个答案:

答案 0 :(得分:2)

您可以像这样使用ranking function ROW_NUMBER() OVER(PARTITION BY ... ORDER BY ...

WITH CTE
AS
(
    Select TOP 1000 
      FH.AtmKey,
      F.FAULTDESC,
      FH.FAULTSTARTTIME,
      FH.FAULTENDTIME,
      FM.FaultIDMSTR,
      ROW_NUMBER() OVER(PARTITION BY FM.FaultIDMSTR
                        ORDER BY FH.FAULTSTARTTIME DESC) AS RN
    From FAULTS_HISTORY FH
    INNER JOIN FAULTDEFS F ON FH.FaultID = F.FAULTID
    INNER JOIN FAULTMAP FM ON F.FAULTID = FM.FaultID
    where FH.AtmKey in ('11487676154140993')
)
SELECT 
  AtmKey,
  AULTDESC,
  FAULTSTARTTIME,
  FAULTENDTIME,
  FaultIDMSTR
FROM CTE
WHERE RN = 1;

如果您希望按其他列添加到FH.FAULTSTARTTIME列中,则会为每个FM.FaultIDMSTR提供最多PARTITION BY的行。

请注意:尽量避免使用旧的JOIN语法,并使用ANSI-92语法,请参阅: