萨钦职业生涯中考试比赛之间的差距最大

时间:2018-02-02 11:28:20

标签: sql-server

我是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

1 个答案:

答案 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天)。