我有一个简单的SQL查询.我正在try 将数据按一年中的星期进行分组,从周一到周日.DATEPART函数似乎很容易做到这一点.但我遇到了一个问题.我得到了重叠的年份日期.

例如,01/01/23在技术上是2023年,但它是2022年最后一周的一部分.当天的数字包含在返回的表中.

这是我所说的一个例子.

enter image description here

SELECT DATEPART(WEEK, responsedate) AS week_number,
       CAST(MIN(responsedate) AS DATE) AS from_date,
       CAST(MAX(responsedate) AS DATE) AS to_date,
       (COUNT(CASE WHEN ov_rating >= 8 THEN 1 END) * 100.0 / NULLIF(COUNT(ov_rating), 0)) AS overall_rating,
       (COUNT(CASE WHEN recommend >= 9 THEN 1 END) * 100.0 / NULLIF(COUNT(recommend), 0)) -
       (COUNT(CASE WHEN recommend BETWEEN 1 AND 6 THEN 1 END) * 100.0 / NULLIF(COUNT(recommend), 0)) AS recommend_score
FROM survey
WHERE EXTRACT(YEAR FROM responsedate) = EXTRACT(YEAR FROM GETDATE())
AND responsedate <= GETDATE()
GROUP BY DATEPART(WEEK, responsedate)
ORDER BY from_date

推荐答案

你需要用ISOYEAR(不是YEAR)和WEEK.YEAR是这一天实际上所属的年份,但ISOYEAR是whole week年的年份.

例如,2023-01-01(YEAR=2023)是一个星期天,属于从前一个星期一开始的第2022-52周(2022-12-26,ISOYEAR=2022,WEEK=52).

请参见https://www.postgresql.org/docs/current/functions-datetime.html:

WEEK是一年中ISO 8601周的编号.根据定义,ISO周从星期一开始,一年的第一周包含该年的1月4日.换句话说,一年的第一个星期四在那一年的第一周.

以及:

建议将isoyear字段与week字段一起使用,以获得一致的结果.

Sql相关问答推荐

SQL查询以创建手头的流动余额?

如何并行SELECT和RESET?

跨多列的PostgreSQL非不同对

LEFT JOIN不显示计数0我期望的方式

按日期时间(不包括秒)连接表

使用generate_series()时,LEFT联接缺少日期/间隔

重用传递给 node 的参数-postgres upsert查询

在 Oracle 21c 中透视文本值

Oracle SQL:通过将日期与另一个表行进行比较来 Select 值

SQL 语句将一列中的值与另一列中的不同值相加,同时按第三列进行分组?

如何使用SQL将患者平均分配给他们所在地区的doctor

使用对 nvarchar 列的多个 LIKE 操作优化 SQL 查询

在多个表上递归查找

计算 SQL 中的总体成功率:递归 CTE 还是替代方法?

如果 SQL 中不存在数据,如何根据某个 ID 为所有日期添加前一行

如何根据另一列对行值进行分组?

当没有任何行存在时,将一个表中的行插入到另一个表中的更好方法

CURRENT_ROW 窗口框架上的 SQL 滞后

snowflake插入覆盖行为

SQL:有没有办法根据另一列的数据细节过滤和形成另一列?