【问题标题】:Store calendar week and year in one (date) column in SQL在 SQL 的一个(日期)列中存储日历周和年
【发布时间】:2022-02-12 23:41:03
【问题描述】:

我的表格包括两列:日历周和年。 如果我想按日历周和年份获取最新条目,我目前执行:

SELECT * FROM table WHERE calyear = (SELECT MAX(calyear) FROM table) AND calweek = (SELECT MAX(calweek) FROM table WHERE calyear = (SELECT MAX(calyear) FROM table))

这是超长的。我想用周和年的组合来替换它,例如'calweek-calyear' 列。是否有日期格式或者我应该将其保存为小文本? 我希望能够对其执行 MAX() 并且性能不应该受到严重影响。 我愿意寻求更好的解决方案,谢谢。

【问题讨论】:

  • 请提供几行样本数据和预期结果。
  • 您使用的是 MySQL 还是 SqlLite?您可以创建一个组合它们的整数,例如SELECT * FROM table WHERE (CalYear * 100) + CalWeek = (SELECT MAX((CalYear * 100) + CalWeek) FROM table);。但是,如果您使用的是更高版本的 MySQL,那么使用RANK() 来识别最大行数可能会更好,但是如果您甚至使用 MySQL,则从标签中不清楚,更不用说更高版本了 - @987654321 @
  • @GarethD 我使用 Mysql(更正标签)。感谢您的评论/回答。
  • 请显示EXPLAIN PLAN ... 的输出(带有您的查询的点。索引可能丢失。另外,查询当前周时您只需要一列(如果该列具有date 类型,例如:select d from dates where weekofyear(d)=6 and year(d)=2022; 将获得当前周。
  • 你对周的定义是什么? ISO 8601 standard 定义?其他定义?

标签: mysql sql date max


【解决方案1】:

您的超长查询可以简化为:

SELECT * 
FROM tablename
ORDER BY calyear DESC, calweek DESC
LIMIT 1;

如果您希望结果只有 1 行。

如果最大calyearcalweek 组合的行数超过1 行,您可以使用RANK() 窗口函数:

SELECT t.*
FROM (
  SELECT *, RANK() OVER (ORDER BY calyear DESC, calweek DESC) rnk
  FROM tablename
) t
WHERE t.rnk = 1;

另外,我建议不要同时使用年和周。
让您的数据尽可能简单。
出于演示目的,您可以轻松地连接 2 列。

【讨论】:

  • 谢谢你的回答,我马上试试。我用mysql。
【解决方案2】:

如果您在 TINYTEXT 列或其他文本类型中连接 YYYYWW,我认为它会满足您的需求。 如果您确保您的周数是 2 位数字,即 01 而不是 1,您可以使用 INT。 我宁愿建议使用列 DATE 和修改后的查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-23
    • 2015-05-29
    • 1970-01-01
    • 1970-01-01
    • 2018-09-28
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多