1

我正在尝试基于两列(类和 ID)创建排名。这将根据最短时间为每门课程在他们自己的班级中排名竞争对手(使用 Chipno)。左 4 列是输入,所需的输出在右列。

Class Chipno 课程时间排名
F23 2025827 A 0:08:20 1
F23 2025827 B 0:17:53 1
F23 2025928 A 0:10:54 2
F23 2025906 B 0:20:49 2
F23 2025810 B 0:33:36 3
F23 2025923 A 0:11:50 3
M23 1398276 B 0:23:21 3
M23 2025805 A 0:09:09 1
M23 1398204 B 0:17:27 2
M23 2025964 B 0:16:48 1
M23 1398249 A 0:10:02 3
M23 1398235 A 0:09:56 2

到目前为止,由于我不确定如何包含第二个条件,因此我陷入了相关查询中。任何帮助,将不胜感激。

4

1 回答 1

1

您可以使用 JOIN 和 GROUP BY 来执行此操作:

SELECT  T.Class, 
        T.ChipNo, 
        T.Course, 
        T.Time, 
        COUNT(T2.ChipNo) + 1 AS [Rank]
FROM    T
        LEFT JOIN T T2
            ON T2.Class = T.Class
            AND T2.Course = T.Course
            AND T2.Time < T.Time
GROUP BY T.Class, T.ChipNo, T.Course, T.Time
ORDER BY T.CLass, T.Course, T.Time;

或使用相关子查询:

SELECT  T.Class, 
        T.ChipNo, 
        T.Course, 
        T.Time, 
        (   SELECT  COUNT(T2.ChipNo) + 1 
            FROM    T T2
            WHERE   T2.Class = T.Class
            AND     T2.Course = T.Course
            AND     T2.Time < T.Time
        ) AS [Rank]
FROM    T
ORDER BY T.CLass, T.Course, T.Time;

我没有在访问中测试过这些,但据我所知,我没有使用任何不受支持的语法。

SQL Fiddle 上的工作示例

示例使用 SQL Server 作为 SQL-Fiddle 上最接近的可比 DBMS。此外,我在这些示例中留下了您的原始排名以进行比较

于 2013-10-01T11:04:48.720 回答