【问题标题】:Display only the first row per match每个匹配只显示第一行
【发布时间】:2012-01-25 12:54:04
【问题描述】:

我有一个表 (AreaPartners),我只想匹配每个组中的第一个“名称”记录,按“ID”排序,按“区域”分组。所以对于下表:

    Area    Name            ID
    AB      ISmith          748
    AB      AWood           750
    AB      HArcher         751
    AB      DMunslow        753
    AB      DCornelius      754
    BH      MLee            301
    BH      NMcClean        307
    BH      DMiles          309
    BH      LPayze          325
    BH      MPinnock        329

我想为 AB 返回结果 ISmith,为 BH 返回结果 MLee。

我该怎么做呢?我相信这与 Group By 功能有关,但我一辈子都无法让它发挥作用。

【问题讨论】:

    标签: sql ms-access group-by


    【解决方案1】:

    试试这个:

    SELECT yourTable.Area, yourTable.Name
    FROM yourTable INNER JOIN (
      SELECT MIN(Id) AS MinId
      FROM yourTable
      GROUP BY Area) M ON yourTable.Id = M.MinId
    

    【讨论】:

    • @aF。 MS Access 对查询中的对象名称不区分大小写(即 IdIDidiD 被视为相同)。
    • 虽然这样,但这样做总是更“敏感”;)
    • 差不多了 - 最终的解决方案使用了另一个我没有提到的表,所以不选择它作为答案是不公平的。这真的很有帮助,谢谢。
    【解决方案2】:

    由于注释而更新(没有表变量并且分区结束不是 MS 访问语句)。您也可以使用 IN 声明来做到这一点:

    SELECT 
        yourTable.Area, 
        yourTable.Name
    FROM yourTable 
    WHERE yourTable.Id IN
    (
        SELECT 
            MIN(tbl.Id) AS MinId
        FROM 
            yourTable as tbl
        GROUP BY 
            tbl.Area
    )
    

    在 MSSQL 中你可以这样写:

    DECLARE @tbl TABLE
        (
            Area VARCHAR(100),
            Name VARCHAR(100),
            ID INT
        )
    INSERT INTO @tbl
    SELECT 'AB','ISmith',748
    UNION ALL
    SELECT 'AB','AWood',750
    UNION ALL
    SELECT 'AB','HArcher',751
    UNION ALL
    SELECT 'AB','DMunslow',753
    UNION ALL
    SELECT 'AB','DCornelius',754
    UNION ALL
    SELECT 'BH','MLee',301
    UNION ALL
    SELECT 'BH','NMcClean',307
    UNION ALL
    SELECT 'BH','DMiles',309
    UNION ALL
    SELECT 'BH','LPayze',325
    UNION ALL
    SELECT 'BH','MPinnock',325
    ;WITH CTE
    AS
    (
    SELECT
        RANK() OVER(PARTITION BY tbl.Area ORDER BY ID) AS iRank,
        tbl.ID,
        tbl.Area,
        tbl.Name
    FROM
        @tbl AS tbl
    )
    SELECT
        *
    FROM
        CTE
    WHERE
        CTE.iRank=1
    

    【讨论】:

    • MS Access 真的有 CTE 和分区函数和表变量吗?
    • 不,抱歉。我以为是 mssql :P.. 但我认为如果它戴上它会是一个甜蜜的选择。
    • 你应该考虑自愿删除你的答案,或者编辑它以使其适用于 MS Access。
    猜你喜欢
    • 2014-08-27
    • 1970-01-01
    • 2017-09-09
    • 2014-09-16
    • 1970-01-01
    • 1970-01-01
    • 2012-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多