1

已多次尝试此查询,感觉就像我错过了一些简单的东西。

这个例子:前 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 具有相等的值?

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

4

1 回答 1

0

尝试这个 :

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 中的任何其他记录(因为您处理的不仅仅是我),但使用您提供的示例数据似乎可行。

于 2014-11-25T13:39:56.373 回答