sql-server-2008 - 跨多个联接进行分组

标签 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列派生的较大值。

我不确定如何通过多个连接实现这种级别的分组,这是我的查询

最佳答案

您可以使用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 语法,请参阅:

关于sql-server-2008 - 跨多个联接进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18713068/

相关文章:

java - 当确认更新行时,为什么我的PreparedStatement.executeUpdate 返回 0?

sql-server - 需要计数查询帮助

mysql - mysql建表

mysql - 显示每小时的聚合数据

sql - 按奇数结果分组

sql - 如何使用 Distinct 在查询选择中获取计数元素?

sql-server-2008 - 帮助解决SqlException:在非负载情况下,连接超时超时

php - 关于连接两个mysql表的问题

带有多个 WHERE 子句的 MySQL JOIN QUERY

mysql - 如何在 MySQL 中使用带有 Group by 的 Set?