Sql 具有两个变量的Ms访问秩

Sql 具有两个变量的Ms访问秩,sql,ms-access,Sql,Ms Access,我正在尝试创建一个基于Class和ID两列的排名。这将根据最短时间,在每个课程中使用Chipno对竞争对手进行排名。左侧4列为输入,右侧列为所需输出 Class Chipno Course Time Rank 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

我正在尝试创建一个基于Class和ID两列的排名。这将根据最短时间,在每个课程中使用Chipno对竞争对手进行排名。左侧4列为输入,右侧列为所需输出

Class Chipno Course Time Rank 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
到目前为止,我已经陷入了一个相关查询中,因为我不确定如何包含第二个条件。任何帮助都将不胜感激。

您可以通过以下方式使用加入和分组:

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;
我没有在access中测试过这些语法,但据我记忆所及,我没有使用任何不受支持的语法


例如,使用SQLServer作为SQLFIDLE上最接近的可比较DBMS。此外,我在这些示例中保留了您的原始排名以供比较

您可以通过以下方式使用连接和分组:

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;
我没有在access中测试过这些语法,但据我记忆所及,我没有使用任何不受支持的语法


例如,使用SQLServer作为SQLFIDLE上最接近的可比较DBMS。此外,我在这些示例中保留了您原来的排名,以供比较

太好了!我今天得出的结果是相似的,但当两个值相等时,它给出了一个更大的位置,例如称之为1,2,4,4,5,而不是1,2,3,3,5个选择位置。[性别],位置。[类别],位置。[奇普诺],位置。[PunchID],位置。[PunchTime],选择count*from位置作为位置2 where位置。[PunchTime]>=位置2。[PunchTime]和位置。[PunchID]=Places2.[PunchID]和Places.[Class]=Places2.[Class]作为PlacesGreat的排名!我今天得出的结果是相似的,但当两个值相等时,它给出了一个更大的位置,例如称之为1,2,4,4,5,而不是1,2,3,3,5个选择位置。[性别],位置。[类别],位置。[奇普诺],位置。[PunchID],位置。[PunchTime],选择count*from位置作为位置2 where位置。[PunchTime]>=位置2。[PunchTime]和位置。[PunchID]=Places2.[PunchID]和Places.[Class]=Places2.[Class]作为Places的排名