MS-Access SELECT TOP N 子查询 SQL

Posted

技术标签:

【中文标题】MS-Access SELECT TOP N 子查询 SQL【英文标题】:MS-Access SELECT TOP N subquery SQL 【发布时间】:2014-11-24 14:43:59 【问题描述】:

多次尝试此查询,感觉我只是缺少一些简单的东西。

这个例子:aggregation subquery with top N 接近我想要完成的目标,但是我不想平均距离,我只想返回前 N 个距离和 shopID。

在我的数据中,值类似于数字分数,值越高越好。我的目标是获得一个列表,显示前 2 个得分最差的 SubTypeNames 及其每个 StationId 的得分。

我的示例表:(复合 PK:StationId 和 SubTypeId)

StationId | SubTypeId | SubTypeName | Value

STA001 | 1 | TypeA | 4.63
STA001 | 2 | TypeB | 2.57
STA001 | 3 | TypeC | 3.54
STA001 | 4 | TypeD | 4.19
STA001 | 5 | TypeE | 1.61
STA002 | 1 | TypeA | 5.12
STA002 | 2 | TypeB | 4.57
STA002 | 3 | TypeC | 1.28
STA002 | 4 | TypeD | 1.27
STA002 | 5 | TypeE | 3.33
STA003 | 1 | TypeA | 4.51
STA003 | 2 | TypeB | 4.51
STA003 | 3 | TypeC | 5.63
STA003 | 4 | TypeD | 1.28
STA003 | 5 | TypeE | 3.25

这种模式重复了 50 多个站点。

我的 UPDTAED 输出:(来自如下所示的查询)

StationId | SubTypeName | Value

STA001 | TypeA | 4.63
STA001 | TypeD | 4.19
STA002 | TypeA | 5.12
STA002 | TypeB | 4.57
STA003 | TypeC | 5.63
STA003 | TypeA | 4.51
STA003 | TypeB | 4.51

我最近的尝试:

SELECT c.StationId, c.SubTypeName, c.Value
FROM [TT: StationSubType Values] As c
WHERE c.SubTypeId IN
(SELECT TOP 2 c2.SubTypeId FROM  [TT: StationSubType Values] As c2 WHERE c2.StationId = c.StationId
ORDER BY c2.Value DESC)
ORDER BY c.StationId ASC, c.Value DESC;

更新:我的上述查询几乎按预期工作。仍然存在的问题是由于有人在他们的评论中预示的同一站的重复值造成的。 出于此查询的目的,我只需要 TOP N,有没有办法只取 n 个结果的第一个 SubTypeId 具有相等的值?

任何帮助将不胜感激。谢谢!

【问题讨论】:

否,在这种情况下,Value 包含一个数字分数,其中较高的值是不好的。因此,目标是按 Station 显示两个得分最差的 SubType。抱歉,我不清楚,我已经相应地编辑了帖子以添加该上下文。 您的表设计是否允许相同 StationId 的重复 Value 值?例如,是否允许 StationId STA001Value 4.63 的另一行? 是的,有可能。但是,由于该表具有复合 PK,因此它适用于不同的 SubTypeId。 您最近的尝试出现了什么问题? 更新了原帖。我的排序是正确的,但是我需要考虑上面评论中预示的多个相等的值。 【参考方案1】:

试试这个:

SELECT  c.SubTypeName,
        c.StationId,
        c.Value

FROM [Sample] AS c
WHERE c.SubTypeId IN

            (SELECT TOP 2 c2.SubTypeId 
             FROM  [Sample] As c2 
             WHERE c2.StationId = c.StationId
             ORDER BY c2.Value DESC, c2.subtypeid)

ORDER BY c.StationId ASC, c.Value DESC

我不确定此解决方案是否会影响 Db 中的任何其他记录(因为您处理的不仅仅是我),但使用您提供的示例数据似乎可行。

【讨论】:

以上是关于MS-Access SELECT TOP N 子查询 SQL的主要内容,如果未能解决你的问题,请参考以下文章

MS-ACCESS:删除除 top 1 之外的所有行并从查询中更新表

MySQL???????????????select top n ----Limit

MySQL中如何实现select top n ----Limit

MS-Access:SQL JOIN 和 INSERT INTO 与 WHERE 慢

sql查询语句:top n的用法

“取出数据表中第10条到第20条记录”的sql语句+select top 使用方法