今天遇到了一个问题。

基本上,在完成查询SELECT * FROM <DB>之后,我需要选择某个日期范围。

例如:

var (date string
     views int
     impressions int)

for query.Next() {
    err := query.Scan(&date, &views, &impressions)
    // handle the err
    // get the range of dates for each month
    // add up all the views and impressions in that specific range
}

显然,“日期”变量将是数据库查询中的所有日期。

日期的格式为:2017-10-01(以10月1日为例),十月大约有300个,十一月大约有100个。

基本上从这里开始,我需要将所有值(视图和展示次数)加起来,但仅按日期范围进行加总。

所以我会得到类似:
2017-10-012017-10-31具有54展示次数2017-10-012017-10-075印象为例。

知道我将如何解决这个问题吗?
希望我能解释这个问题,并在此先感谢。

最佳答案

因此,在这些情况下,最好的选择是使用 map 样式的策略进行跟踪。例如,map [date]数据将允许您为每个日期保留唯一的条目。但是,日期有一个有益的优化,因为它们可以轻松地用整数(一年中的一天)表示,并且选项的数量足够小,不会引起内存问题。这意味着我们可以使用 slice 而不是 map 来获得排序的好处(Go map 在for循环中是随机排序的),同时仍然像 map 一样使用 slice 。例如:

type Data struct {
    // fields
}

const dateFormat = "2006-01-02" // only parse the date

dayStats := make([]Data, 366) // account for leap years

for query.Next() {
    var datestr string // can make this a time.Time, if your date format scans properly
    var dr Data
    if err := query.Scan(datestr, /* other fields */ ); err != nil {
        log.Fatal(err)
    }

    date, err := time.Parse(datestr)
    if err != nil {
        log.Fatal(err)
    }

    dayStats[date.YearDay()].someField += dr.someField
    dayStats[date.YearDay()].someOtherField += dr.someOtherField
    // other fields...
}

现在假设我们要计算10月1日至10月31日之间的统计信息:
start := time.Date(2017, time.October, 1, 0, 0, 0, 0, time.UTC)
end := time.Date(2017, time.October, 31, 0, 0, 0, 0, time.UTC)

var total Data
for day := start.YearDay(); day <= end.YearDay(); day++ {
    total.someField += dayStats[day].someField
    total.someOtherField += dayStats[day].someOtherField
    // other fields...
}

关于sql - 在SQL查询之间获取多个日期范围并相应地添加数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47161559/

10-14 15:58
查看更多