【发布时间】:2019-05-12 14:11:12
【问题描述】:
我有以下两张表:
- DimensionTime 是一个包含每个月的表格,按 ID 排序,采用 YYYMM00 形式
- LogPlayer 是一个表格,其中包含与玩家和特定月份相关的一些统计信息。
我想要得到的是以下内容:
+--------+--------+----------+----------+
| Player | Team | Start | End |
+--------+--------+----------+----------+
| John | Red | 20180100 | 20180300 |
| John | Red | 20180600 | 20180700 |
| Luke | Yellow | 20180100 | 20180100 |
| Luke | Yellow | 20190100 | 20190100 |
+--------+--------+----------+----------+
我不能使用 MIN 和 MAX 函数,因为周期不连续...我该如何解决? 我已经尝试将 MIN/MAX 与 GROUP BY 结合使用,但我没有得到任何有用的信息。我在 Stackoverflow 上找不到任何问题或答案。
SELECT *
INTO #DimensionTime
FROM (
SELECT 1 AS [ID], 20180100 AS [TIMEID]
UNION ALL
SELECT 2 AS [ID], 20180200 AS [TIMEID]
UNION ALL
SELECT 3 AS [ID], 20180300 AS [TIMEID]
UNION ALL
SELECT 4 AS [ID], 20180400 AS [TIMEID]
UNION ALL
SELECT 5 AS [ID], 20180500 AS [TIMEID]
UNION ALL
SELECT 6 AS [ID], 20180600 AS [TIMEID]
UNION ALL
SELECT 7 AS [ID], 20180700 AS [TIMEID]
UNION ALL
SELECT 8 AS [ID], 20180800 AS [TIMEID]
UNION ALL
SELECT 9 AS [ID], 20180900 AS [TIMEID]
UNION ALL
SELECT 10 AS [ID], 20181000 AS [TIMEID]
UNION ALL
SELECT 11 AS [ID], 20181100 AS [TIMEID]
UNION ALL
SELECT 12 AS [ID], 20181200 AS [TIMEID]
UNION ALL
SELECT 13 AS [ID], 20190100 AS [TIMEID]
UNION ALL
SELECT 14 AS [ID], 20190200 AS [TIMEID]
UNION ALL
SELECT 15 AS [ID], 20190300 AS [TIMEID]
) A
SELECT *
INTO #LogPlayer
FROM (
SELECT 'John' AS [Player], 'Red' AS [Team], 20180100 AS [TIMEID]
UNION ALL
SELECT 'John' AS [Player], 'Red' AS [Team], 20180200 AS [TIMEID]
UNION ALL
SELECT 'John' AS [Player], 'Red' AS [Team], 20180300 AS [TIMEID]
UNION ALL
SELECT 'John' AS [Player], 'Red' AS [Team], 20180600 AS [TIMEID]
UNION ALL
SELECT 'John' AS [Player], 'Red' AS [Team], 20180700 AS [TIMEID]
UNION ALL
SELECT 'Luke' AS [Player], 'Yellow' AS [Team], 20180100 AS [TIMEID]
UNION ALL
SELECT 'Luke' AS [Player], 'Yellow' AS [Team], 20190100 AS [TIMEID]
) B
【问题讨论】:
-
您是否真的在使用 SQL Server,尤其是 SQL Server 2005(已不再支持)? SQL Server 不支持
yyyyMM00日期;这是 MySQL 的事情。 -
timeID varchar 是什么数据类型?
-
@Larnu 我认为他的字段是 INT 或 BIG INT 类型,无论如何如果 SQL Server 2005 确实不是最佳方案
-
除了奇怪的“日期”之外,这似乎是您需要对连续日期进行分组的情况。 Jeff Moden 有一个很好的方法来处理这个here。您只需要稍微修改一下以使用月份而不是日期。
-
@Lamu 是的,不幸的是我使用的是老式 SQL Server 2005 和 YYYYMM00,由于这些原因,存储为 VARCHAR。如果有帮助,我可以通过链接服务器在新的 SQL Server 2018 上运行存储过程。
标签: sql sql-server datetime sql-server-2005