SQL:按日期分组

时间:2017-01-27 09:29:06

标签: c# sql razor

我正在寻找一个SQL向导来帮助我解决一个小问题,我被告知我的代码有点无效,并且可以通过更好的SQL查询更好地解决问题,所以首先,这个是我目前的代码。

var days = convertEndDate.Subtract(convertStartDate).TotalDays + 1;
for (int i = 0; i < days; i++)
{
    var getData = "SELECT (kg*rep*sett) as weight, (kg/max) as avg, (rep*sett) as reps, date FROM Test WHERE date = @0 AND exercise < 4";
    var getPeak = "SELECT MAX(kg/max) as peak FROM Test WHERE date = @0 AND exercise < 4";
    db.Execute(getData, dt);
    db.Execute(getPeak, dt);
    //Resets the value to 0 for next foreach loop.
    sumKG = 0;
    totReps = 0;
    avg = 0;
    //Adds a day to the date its currently was checking.
    nextDay = dt.AddDays(1);
    dt = nextDay;

    foreach (var c in db.Query(getData, dt))
    {
        var total = c.weight;
        var reps = c.reps;
        var calcAvg = c.avg * c.reps;
        avg += calcAvg;
        totReps += reps;
        sumKG += total;
    }
    foreach (var d in db.Query(getPeak, dt))
    {
        if (d.peak != null)
        {
            peak = d.peak;
        }
    }

    if (sumKG > 0)
    {
        var sumKGs = sumKG + "kg";
        completeAvg = avg / totReps;
        <a>@sumKGs,  @dt.AddDays(-1).ToString("dd MMM, yyyy"), @completeAvg.ToString("0.#%"), @totReps, @peak.ToString("0.#%")</a> <br />

    }
}

所以目前这确实可以正常工作,但首先我输入一个startdate和一个enddate,然后计算那些天之间的天数,并将其作为for循环中的限制,即( 1&lt;日期之间的天数),然后foreach循环获取第一天的所有数据,然后重复直到for循环达到限制,ofc。

但是,如果选定的日期之间有100天,它将运行SQL查询100次,并且可能有更好的解决方案吗?而且,有2个查询,所以它会做200次查询请求,这是因为我无法弄清楚如何组合2个查询,甚至不确定它是否可能当一个人使用MAX(kg / max)时选择一个值,当另一个查询选择更多值时,数据库中可能有许多行包含相同的日期。

任何人都知道如何更好地做到这一点?

PS。不是MVC项目

2 个答案:

答案 0 :(得分:2)

正如您所说,可以通过对所需结果进行分组来改进查询,因为您只需要求和。第一个查询必须是:

SELECT
    sum((kg*rep*sett)) as weight,
    sum((kg/max)) as avg,
    sum((rep*sett)) as reps,
    date
FROM
    Test
WHERE
    date between @0 and @1
    AND exercise < 4
GROUP BY
    date

您可以将日期从等于更改为需要的日期和结束日期之间更改。这样您将从sql返回所需的所有信息,并且您只需要一个for循环即可在屏幕上打印它。

答案 1 :(得分:1)

您可以合并查询。

def fibonacci(n):
    qmatrix = numpy.array([[1, 1], [1, 0]], dtype=object)
    return numpy.linalg.matrix_power(qmatrix, n)[0, 1]