访问组中的前 n 个

Posted

技术标签:

【中文标题】访问组中的前 n 个【英文标题】:Access top n in group 【发布时间】:2010-08-14 03:44:53 【问题描述】:

我有一张表,我需要在其中获取每个类别的前 n 个最高数量的项目。

类别 项目 InventoryCount -------- ----- ------------- 饮料牛奶 3 饮料水 2 饮料啤酒 9 餐具叉 7 餐具勺 2 餐具刀 1 餐具叉 4

我想要的输出是前 2 个类别中最高的库存。

类别 项目 InventoryCount -------- ----- ------------- 饮料啤酒 9 饮料牛奶 3 餐具叉 7 餐具叉 4

【问题讨论】:

【参考方案1】:

这应该适合你。如果它不满足您的要求,请发回您需要的内容。 您最初的愿望是拥有 25 个,因此您只需将最后一个子句修改为 HAVING COUNT(*) <= 25

SELECT  a.item, 
        a.category, 
        a.inventorycount, 
        COUNT(*) AS ranknumber
FROM inv AS a 
INNER JOIN inv AS b 
     ON (a.category = b.category) 
     AND (a.inventorycount <= b.inventorycount)
GROUP BY  a.category, 
          a.item, 
          a.inventorycount
HAVING COUNT(*) <= 2
ORDER BY a.category, COUNT(*) DESC

如果您想从表中选择更多列,只需将它们添加到 SELECT 和 `GROUP BY' 子句。

只有当您想扩展“TOP n for each Category, foo, bar”时,您才会将这些列添加到INNER JOIN 子句中。

--show the top 2 items for each category and year.
SELECT  a.item, 
        a.category, 
        a.year,
        a.inventorycount, 
        COUNT(*) AS ranknumber
FROM inv AS a 
INNER JOIN inv AS b 
     ON (a.category = b.category) 
     AND (a.year = b.year) 
     AND (a.inventorycount <= b.inventorycount)
GROUP BY  a.category, a.item, a.year, a.inventorycount
HAVING COUNT(*) <= 2
ORDER BY a.year, a.category, COUNT(*) DESC

【讨论】:

谢谢!效果很好!我知道我的要求很高,但我说我又添加了两列:位置和年份。是否可以在同一个查询中按每个位置和年份对前 2 个类别进行分组? @Rick:这是一个复制/粘贴错误。应该是AND。以上已更正。 我的输出有点不一致。我只有 2 年(2009 年、2010 年),所以每个类别我应该得到 4 条记录,但有时我会得到 3 条。在原始查询中,每个类别每年有超过 2 条记录。 您知道 Jet/ACE TOP N 返回领带吗?也就是说,如果前 3 个值为 1、2 和 3,并且有两条记录为 3,那么您的结果中会得到 4 条记录?【参考方案2】:

如果顺序不重要:

SELECT * FROM inv
ORDER BY InventoryCount DESC LIMIT 5

【讨论】:

这个答案不能解决业务问题。另请注意:Microsoft Access 不支持 LIMIT 子句。 不要发布对问题中所述的数据库引擎不起作用的 SQL 答案 -- -1。 对于向 MS Access 问题发布不受支持的 SQL 表示歉意。但如果我错了,请纠正我,但在 Access 中有类似的功能:“select top 5 * from ...” 我不相信 TOP N 和 LIMIT N 是等价的。

以上是关于访问组中的前 n 个的主要内容,如果未能解决你的问题,请参考以下文章

Pandas每组中的前n个值[重复]

按组中的前 n(最少)项计数和分组

SQLite:仅返回每组中的前 2 个结果

求出100个数组里的最大的前十个数最快的算法,c++

猪中按查询的内部组中的前 3 条记录

查询单个表中每个组中的前 5 名候选人