【问题标题】:SQL windowed function/rownum/order bySQL窗口函数/rownum/order by
【发布时间】:2017-12-22 03:21:44
【问题描述】:

我正在尝试查看客户请求重新激活其 Internet 帐户的频率。

问题是,我们捕获了一组有限的数据进行分组。所以我的数据集如下。

我正在尝试从第一次创建重新激活请求到第一次完成进行计数,一旦完成,请完成请求完成所需的天数并计算 NON 的数量在此期间发生的 COMPLETIONS 和 SENT 状态。

下面是示例数据的图像以及表的 sql。希望有人可以提供一点帮助。 (使用 SQL Server 2005 兼容性)

CREATE TABLE #temp
(
Identifier varchar(20)NOT NULL
,CreatedDate DATETIME NOT NULL
,CompletedDate DATETIME NOT NULL
,SN_Type varchar(20) NOT NULL
,SN_Status varchar(20) NOT NULL
)
;

INSERT INTO #temp
VALUES('64074558792','20160729','20160805','Re-Activattion','SENT');
INSERT INTO #temp
VALUES('64074558792','20160810','20160810','Re-Activattion','N-CO');
INSERT INTO #temp
VALUES('64074558792','20160812','20160812','Re-Activattion','N-CO');
INSERT INTO #temp
VALUES('64074558792','20160811','20160811','Re-Activattion','COMP');
INSERT INTO #temp
VALUES('64074558792','20160811','20160813','Re-Activattion','N-CO');
INSERT INTO #temp
VALUES ('61030203647','20160427','20160427','Re-Activattion', 'COMP');
INSERT INTO #temp
VALUES('61030203647','20160425','20160425','Re-Activattion', 'N-CO');
INSERT INTO #temp
VALUES('61030203647','20160422','20160422','Re-Activattion', 'N-CO');
INSERT INTO #temp
VALUES('61030203647','20170210','20170210','Re-Activattion', 'COMP');
INSERT INTO #temp
VALUES('61030203688','20170409','20170210','Re-Activattion', 'SENT');
INSERT INTO #temp
VALUES('61030203699','20170409','20170210','De-Activattion', 'COMP');

【问题讨论】:

  • 很好地提供了我们可以使用的 DDL 和示例数据!为了让您以后更快地使用,您可以用逗号分隔插入内容,而不是每次都输入INSERT INTO #tempINSERT INTO #temp VALUES (...,...,...,...,...),(...,...,...,...,...).
  • 您从哪里获得 610302023647 的最短创建日期?我在创建日期中根本看不到那个日期,更不用说那个 ID。
  • 如何对数据进行排序以获得 HAVE 结果?
  • @scsimon 值的逗号语法是否适用于 SQL 2005 中的 INSERT?我认为那只是 SQL 2008+。但是,您可以在 2005 年使用 INSERT...SELECT...UNION ALL 语法。
  • @Danielle 澄清一下,你的问题是 2005 兼容,但你有 2005 和 2008 的标签。是 2005 年吗?如果是这样,你能改变你的标签吗?

标签: sql sql-server-2005


【解决方案1】:

我不确定这是否满足您的要求,

select identifier,count(1) as cnt,sum(case when sn_status = 'N-CO' then 1 else 0 end) as non_com_cnt ,sum(case when sn_status = 'SENT' then 1 else 0 end) as
 sent_cnt, datediff(dd,min(case when sn_status = 'SENT' then createddate end),max(case when sn_status = 'COMP' then completeddate end)) as diff,min(case when sn_status = 'SENT' then createddate end) as start_date,max(case when sn_status = 'COMP' then completeddate end)  from #temp where sn_type = 'Re-Activattion' group by identifier;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-23
    • 2013-12-07
    • 2019-02-18
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多