具有共同 id 的组中具有最大天数的两个日期之间的差异
Posted
技术标签:
【中文标题】具有共同 id 的组中具有最大天数的两个日期之间的差异【英文标题】:Difference between two dates having maximum days in between from a group having common id 【发布时间】:2017-03-08 01:53:25 【问题描述】:如果我从 B 组中获取日期,那么我必须找到 B 组中任意两个日期之间的最大差异,并将该 days_difference 显示为单独的列。还希望在两个不同的列中显示这两个日期,这些列具有最大的 days_difference。
条件:两个class id可能在数据中有相同的Class-Name。如您所见,Class-ID 1238 和 1252 具有相同的 Class-Name。所以输出应该是每个class-id
所以结果应该有:ClassID、ClassName、Date1、Date 2、DateDiff
ClassName | Dates | ClassID | Spend($)
ClassA | 21-Jun-16 | 1238 | 1
ClassA | 27-Jun-16 | 1238 | 2
ClassA | 14-Apr-11 | 1252 | 3
ClassA | 15-Apr-11 | 1252 | 4
ClassC | 26-Oct-15 | 1261 | 5
ClassC | 21-Oct-15 | 1261 | 6
ClassA | 10-Dec-10 | 1252 | 21
ClassC | 15-Dec-14 | 1261 | 23
ClassC | 15-May-14 | 1261 | 34
ClassA | 10-Jan-09 | 1252 | 54
ClassA | 12-Jun-09 | 1238 | 65
ClassA | 29-Jun-12 | 1238 | 76
ClassA | 11-Apr-08 | 1252 | 87
ClassA | 01-Apr-16 | 1252 | 56
ClassC | 16-Oct-16 | 1261 | 43
ClassC | 02-Sep-05 | 1261 | 33
ClassA | 29-Dec-13 | 1252 | 77
ClassC | 13-Dec-15 | 1261 | 87
ClassC | 13-Aug-10 | 1261 | 98
ClassA | 21-Jan-14 | 1252 | 12
【问题讨论】:
您使用的是哪个 DBMS? 什么是“B组”?您的数据样本中没有任何内容涉及此内容。 对不起。其实这种情况下只能考虑ClassID,考虑成组。 如果一个 ID 有四个日期,那么我必须找出该 ID 的哪两个连续日期的天数差异最大 有 LAG 和 LEAD 选项可以获取上一个或下一个日期并与当前行进行比较 【参考方案1】:SELECT A.ClassId,
B.LagDates,
B.Dates
FROM
(
SELECT ClassId,
MAX( DaysDiff ) AS MD
FROM
(
SELECT *,
LAG( Dates, 1 ) OVER ( PARTITION BY ClassID ORDER BY Dates ) AS LagDates,
TO_DATE( Dates, 'YYYY-MM-DD' )
-
LAG( Dates, 1 ) OVER ( PARTITION BY ClassID ORDER BY
Dates ) AS DaysDiff
FROM ( SELECT *
FROM Table
ORDER BY ClassId, Dates
)
)
GROUP BY ClassId
) A,
(
SELECT *,
LAG( Dates, 1 ) OVER ( PARTITION BY ClassID ORDER BY Dates ) AS LagDates,
TO_DATE( Dates, 'YYYY-MM-DD' )
-
LAG( Dates, 1 ) OVER ( PARTITION BY ClassID ORDER BY Dates )
AS DaysDiff
FROM (
SELECT *
FROM Table
ORDER BY ClassId, Dates
)
) B
WHERE A.ClassId = B.ClassId
AND A.MD = B.DaysDiff;
【讨论】:
如果我必须加入两个表怎么办?我应该在哪里指定我的加入条件? @RohitJachak - 您指定它所属的连接条件。您的原始问题中没有提到加入,为什么在人们回答您的问题之前保留这些细节?您需要加入什么 - 输入中的表格?这个查询的输出?介于两者之间? @Teja 嗨。我实际上已经完全更新了这个问题。很抱歉给您带来不便。 @mathguy 我已经更新了我的问题。很抱歉给您带来不便。【参考方案2】:您可以使用 LEAD 或 LAG 获取连续日期之间的天差。
SELECT
Dates,
LEAD(Dates) OVER (PARTITION BY ClassID ORDER BY Dates) NextDate,
Dates - LEAD(Dates) OVER (PARTITION BY ClassID ORDER BY Dates) DaysDiff
FROM MyTable
你可以通过获取DaysDiff值最高的记录,从这个结果中得到你想要的结果
for reference
对结果进行排名并获得每个 classID 排名最高的日期差异。
SELECT * FROM (
SELECT *, RANK() OVER (PARTITION BY ClassID ORDER BY DaysDiff DESC) Rnk
FROM (
SELECT
ClassID,
ClassName,
Dates,
LEAD(Dates) OVER (PARTITION BY ClassID ORDER BY Dates) NextDate,
Dates - LEAD(Dates) OVER (PARTITION BY ClassID ORDER BY Dates) DaysDiff
FROM MyTable) t1
) t2
WHERE t2.Rnk = 1
上述样本数据的输出应该是。
ClassName ClassID Dates NextDate DaysDiff Rnk
--------- ----------- ----------------------- ----------------------- ----------- --------------------
ClassA 1238 2012-06-29 00:00:00.000 2016-06-21 00:00:00.000 1453 1
ClassA 1252 2011-04-15 00:00:00.000 2013-12-29 00:00:00.000 989 1
ClassC 1261 2005-09-02 00:00:00.000 2010-08-13 00:00:00.000 1806 1
【讨论】:
但我想要连续日期之间最大的差异。不计算所有连续日期之间的差异并显示它。 @RohitJachak 我只是给你一个起点,但我已经更新了答案以使用 RANK 函数来获取最高日期差异记录。 我实际上已经完全更新了这个问题。很抱歉给您带来不便。以上是关于具有共同 id 的组中具有最大天数的两个日期之间的差异的主要内容,如果未能解决你的问题,请参考以下文章