SQL查询以汇总最近7天的数据

瑞安德金斯

假设我有一个像这样的表结构。

CheckIn
- int checkInId pk
- int companyPositionId
- Date checkInDate

假设我要获取给定日期以来最近7天的所有签到次数。最好的方法是什么?现在,我要查询7个日期和公司职位。目前这太慢了,因为可能有很多companyPositions * 7天。如何将其汇总为一个查询?

生成最近7天的日期并构造一个长查询最简单吗?然后可以按7天中的每一天的日期范围进行分组计数吗?

理想的结果可能看起来像:

companyPositionId, date1Count, date2Count, date3Count, date4Count, date5Count, date6Count.

示例数据:

checkInId | companyPositionId | checkInDate
1         | 1                 | 1970-01-01
2         | 1                 | 1970-01-02
3         | 1                 | 1970-01-03
4         | 1                 | 1970-01-04
5         | 1                 | 1970-01-05
6         | 1                 | 1970-01-06
7         | 1                 | 1970-01-07
8         | 2                 | 1970-01-01
9         | 2                 | 1970-01-02
10        | 2                 | 1970-01-03
11        | 2                 | 1970-01-04
12        | 2                 | 1970-01-05
13        | 2                 | 1970-01-06
14        | 2                 | 1970-01-07*
15        | 2                 | 1970-01-07*

我当前的查询是这样的:

SELECT * FROM CheckIn
  WHERE (startDate) <= (inputDate) 
    AND (inputDate) <= (endDate)
    AND companyPositionId = (companyPositionId);

然后,我遍历从一天的开始到该天结束之间生成的每个startDate / endDate。然后是每个companyPositionId。

理想结果:

companyPositionId | date1Count | date2Count | date3Count | date4Count | date5Count | date6Count | date7Count
1                 | 1          | 1          | 1          | 1          | 1          | 1          | 1
2                 | 1          | 1          | 1          | 1          | 1          | 1          | 2
汤姆·H

您可以使用PIVOT命令或条件SUMs来执行此操作

DECLARE @my_date DATE = CAST(GETDATE() AS DATE)

SELECT
    companyPositionId,
    SUM(CASE WHEN CAST(checkInDate AS DATE) = DATEADD(DAY, -7, @my_date) THEN 1 ELSE 0 END) AS date1Count,
    SUM(CASE WHEN CAST(checkInDate AS DATE) = DATEADD(DAY, -6, @my_date) THEN 1 ELSE 0 END) AS date2Count,
    SUM(CASE WHEN CAST(checkInDate AS DATE) = DATEADD(DAY, -5, @my_date) THEN 1 ELSE 0 END) AS date3Count,
    SUM(CASE WHEN CAST(checkInDate AS DATE) = DATEADD(DAY, -4, @my_date) THEN 1 ELSE 0 END) AS date4Count,
    SUM(CASE WHEN CAST(checkInDate AS DATE) = DATEADD(DAY, -3, @my_date) THEN 1 ELSE 0 END) AS date5Count,
    SUM(CASE WHEN CAST(checkInDate AS DATE) = DATEADD(DAY, -2, @my_date) THEN 1 ELSE 0 END) AS date6Count,
    SUM(CASE WHEN CAST(checkInDate AS DATE) = DATEADD(DAY, -1, @my_date) THEN 1 ELSE 0 END) AS date7Count
FROM
    CheckIn
WHERE
    checkInDate BETWEEN DATEADD(DAY, -7, GETDATE()) AND DATEADD(DAY, -1, GETDATE())
GROUP BY
    companyPositionId

如果您的checkInDate具有时间成分,则需要考虑这一点。

我声明该@my_date变量只是为了避免在查询中重复多次该表达式,但是您可以用该表达式替换该变量,它也可以正常工作。您还可以使用BETWEEN可能具有更好的性能,因为优化程序随后可能会在上使用索引checkInDate只需计算每一天的午夜/ 11:59:59,而不是寻找平等。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

SQL查询以汇总最近7天的数据

来自分类Dev

SQL查询以列出最近7天的记录

来自分类Dev

查询以从最近7天开始生效

来自分类Dev

如何获取最近 7 天的健康数据

来自分类Dev

Jooq查询以获取最近两天更新的数据

来自分类Dev

最近30天的SQL Server数据及所有数据

来自分类Dev

如何在数据流中存储最近的“ n”天/周/月/年汇总?

来自分类Dev

显示最近7天的行

来自分类Dev

获取最近7天的记录

来自分类Dev

汇总模板中的数据(天)

来自分类Dev

MySQL查询汇总过去7天内创建的版本数

来自分类Dev

使用sqlite的Ruby on Rails,尝试查询并返回最近7天的结果吗?

来自分类Dev

使用MongoDB Mongoid Rails查询最近7或30天的日期范围

来自分类Dev

节点JS | 从数据库中获取最近7天的数据

来自分类Dev

查询WHERE日期最近于14天

来自分类Dev

LINQ查询以获取最近30天的记录

来自分类Dev

如何从mysql中选择最近7天的结果(带有自定义数据字段)?

来自分类Dev

SQL查询汇总列

来自分类Dev

如何根据Sql查询中的AcctName汇总数据

来自分类Dev

如何编写SQL Server查询以汇总表数据?

来自分类Dev

SQL 查询:如何执行此数据透视汇总?

来自分类Dev

mysql多个表选择最近7天

来自分类Dev

如何选择最近 7 天可用 - MySql

来自分类Dev

SQL查询最近的订单

来自分类Dev

SQL查询以获取最近3个月的数据

来自分类Dev

使用日期转换时,SQL输出仅获得最近7天的输出

来自分类Dev

如何从包含0值的SQL中获取最近7天的总和

来自分类Dev

如何从包含0值的SQL中获取最近7天的总和

来自分类Dev

每周或3天汇总数据