【问题标题】:difference between dates in same group同一组中的日期之间的差异
【发布时间】:2017-03-10 04:48:24
【问题描述】:

如果我从 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

【问题讨论】:

  • 请显示一个完整、有效的预期输出表格,以及到目前为止您尝试过的内容。您谈论“组”,但在您的示例中没有任何名称为“组”。你的意思是,“类名?”请在发布问题时具体准确。
  • 鉴于样本输入数据,您期望结果是什么样的?你的逻辑我不清楚。不过,我猜你会想看看LAG() 分析函数。
  • 输出应该是 table 中的每个 class-id。例如,如果您使用 class-id 1252,那么查询实际上应该遍历 id-1252 的所有日期,并找到两个连续日期之间的差异,这些日期对于 id-1252 具有最大 days_difference。表中的其他类 ID 也是如此。如果问题有点令人困惑,我很抱歉。
  • 如果输出仅按 CLASSID 分组,那么您打算如何在输出中包含 CLASSNAME?我们以 CLASSID = 1238 为例。您期望该 CLASSID 的输出是什么?
  • 输出应包括类名。因此,为了显示输出,分组完全是您的选择。对于 ClassID 1238,我需要类名 Date1、Date2、Days_Difference_between_Date1andDate2。日期 1 和日期 2 是 ClassID 1238 的连续日期,它们之间有最大的 days_difference。因此,如果 table 中有 500 个不同的 class-id,则输出应该有 500 行。我希望这可以消除疑问。注意:对于每个类 ID,Class_name 不是唯一的。两个 id 可以有完全相同的类名。

标签: sql oracle group-by datediff date-difference


【解决方案1】:

如 cmets 中所述,您可以在此处使用 lag() 函数,然后过滤具有最大日期差异的行:

with t1 as (select classname, classid, 
                   lag(dates) over (partition by classname, classid 
                                        order by dates) dt1, 
                   dates dt2, 
                   dates - lag(dates) over (partition by classname, classid 
                                                order by dates) diff
              from t ),
     t2 as (select classname, classid, dt1, dt2, diff, 
                   max(diff) over (partition by classname, classid) mdiff
              from t1)
select classname, classid, dt1, dt2, diff
  from t2 
  where diff = mdiff
  order by classname, classid

测试数据和输出:

create table t (classname varchar2(8), dates date, classid number(5), spend number(3));
insert into t values ('ClassA', date '2016-06-21', 1238,  1);
insert into t values ('ClassA', date '2016-06-27', 1238,  2);
insert into t values ('ClassA', date '2011-04-14', 1252,  3);
insert into t values ('ClassA', date '2011-04-15', 1252,  4);
insert into t values ('ClassC', date '2015-10-26', 1261,  5);
insert into t values ('ClassC', date '2015-10-21', 1261,  6);
insert into t values ('ClassA', date '2010-12-10', 1252, 21);
insert into t values ('ClassC', date '2014-12-15', 1261, 23);
insert into t values ('ClassC', date '2014-05-15', 1261, 34);
insert into t values ('ClassA', date '2009-01-10', 1252, 54);
insert into t values ('ClassA', date '2009-06-12', 1238, 65);
insert into t values ('ClassA', date '2012-06-29', 1238, 76);
insert into t values ('ClassA', date '2008-04-11', 1252, 87);
insert into t values ('ClassA', date '2016-04-01', 1252, 56);
insert into t values ('ClassC', date '2016-10-16', 1261, 43);
insert into t values ('ClassC', date '2005-09-02', 1261, 33);
insert into t values ('ClassA', date '2013-12-29', 1252, 77);
insert into t values ('ClassC', date '2015-12-13', 1261, 87);
insert into t values ('ClassC', date '2010-08-13', 1261, 98);
insert into t values ('ClassA', date '2014-01-21', 1252, 12);

CLASSNAME CLASSID DT1         DT2               DIFF
--------- ------- ----------- ----------- ----------
ClassA       1238 2012-06-29  2016-06-21        1453
ClassA       1252 2011-04-15  2013-12-29         989
ClassC       1261 2005-09-02  2010-08-13        1806

【讨论】:

  • 谢谢!!但问题是在我的案例中存在重复的 CLASS-ID。如果表 t 中有 500 个不同的 class-id,我将在最终结果中得到 650 行而不是 500
  • 因此,在您的数据中,同一个 ClassId 有多个 ClassName。在您的示例中,我们没有这样的行。我不知道在这种情况下您想要什么,但我怀疑您必须在 partition by 子句中删除 classname。取决于所有逻辑 - 您必须在任何地方或仅在子查询 t2 中执行此操作。
猜你喜欢
  • 2019-09-25
  • 2013-01-28
  • 1970-01-01
  • 2011-02-01
  • 2011-07-30
  • 2011-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多