【问题标题】:How can I get result from group by on With clause(cte) in tsql如何通过 SQL 中的 With 子句(cte)从 group by 获取结果
【发布时间】:2013-12-24 06:05:45
【问题描述】:

我使用这个查询来得到这些结果:

代码:

With Res
As
(
SELECT GroupID ,HV.[HadithVerID] As HadithId ,CenturyID
FROM JHadithVer HV 
INNER JOIN JHadith H ON HV.HadithID = H.HadithID 
    WHERE HV.SourceID=28
)
Select * From Res

结果:

GroupId Hadithid    CenturyId
7565    27062   4
22206   27063   4
125903  27064   6
60671   27065   4
125903  27074   4
125903  27083   4

如何更改我对 with(Res) 的选择,以便在常见的 GroupId 和较少的 CenturyId 之间获取 HadithId。例如在

之间
125903  27064   6

125903  27074   4

125903  27083   4

结果是:27074(在 2 个结果 2707427083 之间,我希望 27074 更少! )

【问题讨论】:

  • 所以,从您提供的样本数据中,您只需要这条记录:125903 27074 4,因为还有其他记录具有相同的GroupID,但这条记录的Hadithid 在其他记录之间Hadithid的?

标签: sql-server tsql group-by common-table-expression


【解决方案1】:

我认为这可以帮助你。

With Res
As
(
SELECT GroupID ,HV.[HadithVerID] As HadithId ,CenturyID
FROM JHadithVer HV 
INNER JOIN JHadith H ON HV.HadithID = H.HadithID 
    WHERE HV.SourceID=28
)
Select  GroupID ,MIN(HadithId),CenturyID 
From Res
Group By GroupID,CenturyID 

【讨论】:

    【解决方案2】:

    因此,据我了解,您需要对记录进行排名,然后选择排名最低的记录。排名应按以下方式进行:特定GroupId 的最低排名具有最低Hadithid 最低CenturyId 的记录。您只需使用排名函数ROW_NUMBER() 对 CTE 表达式中的记录进行排名:

    With Res
    As
    (
    SELECT GroupID ,HV.[HadithVerID] As HadithId ,CenturyID,
           -- Add ranking
           ROW_NUMBER() OVER(PARTITION BY GroupId ORDER BY CenturyId, HadthId) AS RANK
    FROM JHadithVer HV 
    INNER JOIN JHadith H ON HV.HadithID = H.HadithID 
        WHERE HV.SourceID=28
    )
    Select * From Res
        WHERE RANK = 1    -- select all minimal values for every GroupId
    

    【讨论】:

      【解决方案3】:

      您只需像这样查询您的 CTE 结果集:

      SELECT 
        T.GroupID, 
        T.Hadithid, 
        T.CenturyID
      FROM RES T
      INNER JOIN (
          SELECT 
            T.GroupId, 
            T.CenturyID, 
            MIN(T.Hadithid) AS 'Hadithid'
          FROM RES T
          INNER JOIN (
              SELECT 
                GroupID,
                MIN(CenturyID) AS 'CenturyID'
              FROM RES T
              GROUP BY GroupID
              ) T3 ON T3.CenturyID = T.CenturyID
          GROUP BY T.GroupID, T.CenturyID
          ) 
          T2 ON T.Hadithid = T2.Hadithid
      WHERE T.GROUPID = 125903
      

      这是SQLFiddle

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-07-29
        • 1970-01-01
        • 2020-10-26
        • 1970-01-01
        • 2011-12-17
        • 2013-01-05
        • 2020-04-01
        相关资源
        最近更新 更多