SQL:改进选择查询

庞特斯·斯维德伯格

我有理由相信此代码可以做得更好,并且可能从查询开始做更多的工作?

我将尽力解释这一点。

我数据库中的每一行都有一个1,2或3值exercise,然后还有一个数字,因为rep它可以是任何数字,但是在此代码中,我选择只关心1-12,因此此代码选择具有以下内容的行:的最高值kilograms(这是一个柱和具有值在每一行上),其中exercise在1和rep为1,然后2和3等等,直至12,然后改变exercise为2,并且从1-12再次变为选择第一kilograms排。

这有意义吗?

for (var i = 1; i <= 3; i++) {
    for (var ii = 1; ii <= 12; ii++) {
        var getPR = "SELECT top 1 kg, rep, date FROM Test WHERE exerVariName = 'Comp' AND exercise = @0 AND rep = @1 order by kg desc";
        db.Execute(getPR, i, ii);
        foreach (var get in db.Query(getPR, i, ii)) {
            DateTime Date = get.Date;
            var finalDate = Date.ToString("MMM d, yyyy");
            var weight = get.kg + "kg";
            var reps = "x " + get.rep;
            <a>@weight @reps - @finalDate</a>
            <br>
        }
    }
}

我使用的是SQL Server Compact,它不是MVC项目。

伊凡·格里申科(Ivan Gritsenko)

您可以使用Group ByMAX聚合函数仅通过一个查询选择感兴趣的所有行

SELECT t.kg, t.rep, t.date
FROM Test t
INNER JOIN 
    (SELECT MAX(kg) as kg, exercise, rep
    FROM Test
    WHERE exerVariName = 'Comp'
    GROUP BY exercise, rep) i
ON t.exercise = i.exercise AND t.rep = i.rep AND t.kg = i.kg
WHERE t.exerVariName = 'Comp'

内部查询仅执行一次。它找到一个组标识符(exercise, rep)元组和一个相应的最大kg组值。然后将内部查询与Test表结合起来,以获取行的“内容”(在您的情况下,仅一个附加字段date)。

总体性能是最佳的。

您只需要遍历此查询的结果。

请参阅本主题


编辑:

排除多个(rep, exercise)具有相同记录kg(与OP循环几乎相同的结果)

SELECT kg, rep, exercise, MAX(date) 
FROM 
    (SELECT t.kg, t.rep, t.exercise, t.date
    FROM Test t
    INNER JOIN 
        (SELECT MAX(kg) as kg, exercise, rep
        FROM Test
        WHERE exerVariName = 'Comp'
        GROUP BY exercise, rep) i
    ON t.exercise = i.exercise AND t.rep = i.rep AND t.kg = i.kg
    WHERE t.exerVariName = 'Comp') t
GROUP BY t.kg, t.rep, t.exercise

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章