每个匹配只显示第一行

Posted

技术标签:

【中文标题】每个匹配只显示第一行【英文标题】: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 功能有关,但我一辈子都无法让它发挥作用。

【问题讨论】:

【参考方案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。

以上是关于每个匹配只显示第一行的主要内容,如果未能解决你的问题,请参考以下文章

sed命令,搜索某个字符串,结果有多个匹配行,在第一个匹配行的前面添加一行内容

如何计算 AIX 上每个文件的正则表达式匹配总数

第一个正则表达式实例匹配在第一行不匹配?

更新匹配条件的第一行

Linux三剑客(sed)-编辑匹配到的文本

运维学习第三弹