每个匹配只显示第一行
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 对查询中的对象名称不区分大小写(即Id
与 ID
或 id
或 iD
被视为相同)。
虽然这样,但这样做总是更“敏感”;)
差不多了 - 最终的解决方案使用了另一个我没有提到的表,所以不选择它作为答案是不公平的。这真的很有帮助,谢谢。【参考方案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。以上是关于每个匹配只显示第一行的主要内容,如果未能解决你的问题,请参考以下文章