我是SQL服务器的新手,正在练习使用我在这里找到的Sachin的击球统计数据(Cricket)。 (Sachin Batting Statistics)。我想找到萨钦职业生涯中两场比赛之间最长的差距。所以基本上必须根据测试匹配对其进行过滤,并在Start_DateAscending列中找到最大差异?希望这有点道理。 Sample table added if link doesn't make sense
编辑:我创建了一个包含不同日期的示例表。该列名为DateValues。现在,我想找到DateValue列中任意两个连续行之间最大差异的代码。例如,在这种情况下,答案是从1989年12月9日到1991年12月26日之间的2年零17天
IF OBJECT_ID('TempDB..#mytable','U') IS NOT NULL
DROP TABLE #mytable
CREATE TABLE #mytable
(
ID INT IDENTITY(1,1) PRIMARY KEY CLUSTERED,
DateValue DATETIME
)
SET DATEFORMAT DMY
SET IDENTITY_INSERT #mytable ON
INSERT INTO #mytable
(ID, DateValue)
SELECT '11', 'Nov 15 1989 12:00AM' UNION ALL
SELECT '59', 'Nov 23 1989 12:00AM' UNION ALL
SELECT '37', 'Dec 09 1989 12:00AM' UNION ALL
SELECT '44', 'Dec 26 1991 12:00AM' UNION ALL
SELECT '55', 'May 31 1993 12:00AM' UNION ALL
SELECT '60', 'May 15 1995 12:00AM' UNION ALL
SELECT '57', 'Jan 12 1996 12:00AM' UNION ALL
SELECT '43', 'Jan 19 1996 12:00AM' UNION ALL
SELECT '49', 'Jan 31 1996 12:00AM' UNION ALL
SELECT '18', 'Oct 17 1997 12:00AM'
这是我在本网站上找到的解决方案,我得到的答案是1900-01-01!
SELECT MAX(#mytable.DateValue-h.DateValue) as maxDiff
FROM #mytable
LEFT JOIN #mytable h
ON h.ID=[dbo].#mytable.ID AND #mytable.DateValue>=h.DateValue
WHERE h.DateValue IS NOT NULL
答案 0 :(得分:0)
如果您正在使用SQL Server 2012或更高版本,则此SQL将返回两次测试之间的最大差距:
select max(datediff(day, a.TestDate, a.NextTest)) as BiggestGap
from (
select DateValue as TestDate, lead(DateValue) over (order by DateValue) as NextTest
from #mytable m
) a
此查询的第一件事(在括号内)是获取一个表,列出所有测试匹配和下一个测试匹配的日期。这是最里面的查询提供的内容:它选择所有测试日期,并使用lead
函数直接测试后的匹配日期。
来自括号中的select(包括ID)的数据如下所示:
ID TestDate NextTest
----------- ----------------------- -----------------------
11 1989-11-15 00:00:00.000 1989-11-23 00:00:00.000
59 1989-11-23 00:00:00.000 1989-12-09 00:00:00.000
37 1989-12-09 00:00:00.000 1991-12-26 00:00:00.000
44 1991-12-26 00:00:00.000 1993-05-31 00:00:00.000
55 1993-05-31 00:00:00.000 1995-05-15 00:00:00.000
60 1995-05-15 00:00:00.000 1996-01-12 00:00:00.000
57 1996-01-12 00:00:00.000 1996-01-19 00:00:00.000
43 1996-01-19 00:00:00.000 1996-01-31 00:00:00.000
49 1996-01-31 00:00:00.000 1997-10-17 00:00:00.000
18 1997-10-17 00:00:00.000 NULL
之后(在括号外),它只是找到日期之间差异最大的行的情况。在SQL Server中,最好使用datediff
函数来获取两个日期之间的差异,而不是在您看到的示例中使用数学运算符,例如-
,因此我们使用它来获取每行之间的天数差异。 max
用于获得最大的那些,从而返回两场比赛之间的最大差距。
使用提供的示例SQL数据,最大差距是747天(大约2年17天)。