选择上一个动作之后的第一个动作实例

Posted

技术标签:

【中文标题】选择上一个动作之后的第一个动作实例【英文标题】:Select the first instance of an action after the previous action 【发布时间】:2020-03-06 21:58:57 【问题描述】:

所以,这个主题非常混乱,因为我只是不知道如何用文字来解释我想要什么。我正在尝试通过操作从单个表中提取数据。下面是我的数据的一个小样本。

在每个名称的上一个操作之后,我需要每个 OptIn 和 OptOut 的第一个实例。我也在下面发布了我想要的结果。

我正在尝试在 SQL 2014 中执行此操作。我对此一无所知。我想也许我可以延迟一段时间,但我不完全了解如何使用它们,所以我很困惑。

样本数据:

Inst,Acct,First,MI,Last,Activty,ActivtyDate

001,00000000001111111,EDWARD,,BICKLE,OptIn,2019-05-25 12:02:00.000
001,00000000001111111,EDWARD,,BICKLE,OptIn,2019-05-25 12:37:00.000
001,00000000001111111,KIM,,BICKLE,OptIn,2019-06-17 08:43:00.000
001,00000000001111111,EDWARD,,BICKLE,OptOut,2019-06-20 11:57:00.000
001,00000000001111111,EDWARD,,BICKLE,OptOut,2019-06-20 23:10:00.000
001,00000000001111111,EDWARD,,BICKLE,OptOut,2019-06-21 08:46:00.000
001,00000000001111111,EDWARD,,BICKLE,OptIn,2019-06-27 10:34:00.000
001,00000000001111111,EDWARD,,BICKLE,OptOut,2019-06-27 10:35:00.000
001,00000000001111111,EDWARD,,BICKLE,OptOut,2019-06-27 23:04:00.000
001,00000000001111111,KIM,,BICKLE,OptIn,2019-07-02 11:35:42.000
001,00000000001111111,EDWARD,,BICKLE,OptOut,2019-07-05 15:04:00.000
001,00000000001111111,EDWARD,,BICKLE,OptIn,2019-07-06 07:57:00.000
001,00000000001111111,EDWARD,,BICKLE,OptIn,2019-07-06 08:16:00.000
001,00000000001111111,EDWARD,,BICKLE,OptIn,2019-07-09 08:17:00.000
000,00000000002222222,DAWN,M,ADAMS,OptOut,2019-03-03 20:51:00.000
000,00000000002222222,DAWN,M,ADAMS,OptOut,2019-03-03 20:51:00.000
000,00000000002222222,DAWN,M,ADAMS,OptIn,2019-03-08 19:10:00.000
000,00000000002222222,DAWN,M,ADAMS,OptIn,2019-03-16 06:34:00.000
000,00000000002222222,DAWN,M,ADAMS,OptOut,2019-03-18 16:21:00.000
000,00000000002222222,DAWN,M,ADAMS,OptIn,2019-03-21 16:38:00.000
000,00000000002222222,DAWN,M,ADAMS,OptOut,2019-03-22 05:26:00.000
000,00000000002222222,DAWN,M,ADAMS,OptIn,2019-04-01 15:39:00.000
000,00000000002222222,DAWN,M,ADAMS,OptOut,2019-04-02 04:06:00.000
000,00000000002222222,DAWN,M,ADAMS,OptIn,2019-04-06 11:53:00.000
000,00000000002222222,DAWN,M,ADAMS,OptOut,2019-04-09 12:51:00.000
000,00000000002222222,DAWN,M,ADAMS,OptOut,2019-04-20 15:21:00.000
000,00000000002222222,DAWN,M,ADAMS,OptIn,2019-04-20 15:21:00.000

期望的结果:

Inst,Acct,First,MI,Last,Activty,ActivtyDate

001,00000000001111111,EDWARD,,BICKLE,OptIn,2019-05-25 12:02:00.000
001,00000000001111111,EDWARD,,BICKLE,OptOut,2019-06-20 11:57:00.000
001,00000000001111111,EDWARD,,BICKLE,OptIn,2019-06-27 10:34:00.000
001,00000000001111111,EDWARD,,BICKLE,OptOut,2019-06-27 10:35:00.000
001,00000000001111111,KIM,,BICKLE,OptIn,2019-07-02 11:35:42.000
001,00000000001111111,EDWARD,,BICKLE,OptOut,2019-07-05 15:04:00.000
001,00000000001111111,EDWARD,,BICKLE,OptIn,2019-07-06 07:57:00.000
000,00000000002222222,DAWN,M,ADAMS,OptOut,2019-03-03 20:51:00.000
000,00000000002222222,DAWN,M,ADAMS,OptIn,2019-03-08 19:10:00.000
000,00000000002222222,DAWN,M,ADAMS,OptOut,2019-03-18 16:21:00.000
000,00000000002222222,DAWN,M,ADAMS,OptIn,2019-03-21 16:38:00.000
000,00000000002222222,DAWN,M,ADAMS,OptOut,2019-03-22 05:26:00.000
000,00000000002222222,DAWN,M,ADAMS,OptIn,2019-04-01 15:39:00.000
000,00000000002222222,DAWN,M,ADAMS,OptOut,2019-04-02 04:06:00.000
000,00000000002222222,DAWN,M,ADAMS,OptIn,2019-04-06 11:53:00.000
000,00000000002222222,DAWN,M,ADAMS,OptOut,2019-04-09 12:51:00.000
000,00000000002222222,DAWN,M,ADAMS,OptIn,2019-04-20 15:21:00.000

【问题讨论】:

样本数据很好,但如果有人可以复制和粘贴它会更好。这个样本数据需要大量的修改才能变成一个可行的插入。坦率地说,我根本无法判断您在这里要做什么。 “我需要在每个名称的上一个操作之后每个 OptIn 和 OptOut 的第一个实例。”所以InstAcct 没有作用,它们只是顺路? 很抱歉没有按照您的喜好格式化数据。样本数据是针对 2 个帐户在一年中选择加入或退出服务的次数。我被要求提供一份报告,列出在给定年份执行此操作 12 次的账户(附有姓名)。我的实际数据是数千个帐户,其中一些已执行此操作 20 多次,而其他仅执行一次。他们想要一份关于他们每次翻转动作动作的报告。但是,如果您复制操作,编写不佳的软件会记录该操作。所以我需要过滤掉那些。 【参考方案1】:

您可以使用lag() 来识别activity 与“先前”记录不同的记录:

select t.*
from (
    select 
        t.*,
        lag(activity) over(partition by inst, acct order by activityDate) lag_activity
    from mytable t
) t
where lag_activity is null or activity <> lag_activity
order by inst, acct, activityDate   

Demo on DB Fiddle

研究所 |帐户 |第一 |米|最后 |活动 |活动日期 |滞后活动 ---: | ------: | :----- | :--- | :----- | :-------- | :------------------------ | :----------- 1 | 1111111 |爱德华 | |比克 |选择 | 2019-05-25 12:02:00.000 | 1 | 1111111 |爱德华 | |比克 |退出 | 2019-06-20 11:57:00.000 |选择参加 1 | 1111111 |爱德华 | |比克 |选择 | 2019-06-27 10:34:00.000 |选择退出 1 | 1111111 |爱德华 | |比克 |退出 | 2019-06-27 10:35:00.000 |选择参加 1 | 1111111 |金 | |比克 |选择 | 2019-07-02 11:35:42.000 |选择退出 1 | 1111111 |爱德华 | |比克 |退出 | 2019-07-05 15:04:00.000 |选择参加 1 | 1111111 |爱德华 | |比克 |选择 | 2019-07-06 07:57:00.000 |选择退出 0 | 2222222 |黎明 |中号 |亚当斯 |退出 | 2019-03-03 20:51:00.000 | 0 | 2222222 |黎明 |中号 |亚当斯 |选择 | 2019-03-08 19:10:00.000 |选择退出 0 | 2222222 |黎明 |中号 |亚当斯 |退出 | 2019-03-18 16:21:00.000 |选择 0 | 2222222 |黎明 |中号 |亚当斯 |选择 | 2019-03-21 16:38:00.000 |退出 0 | 2222222 |黎明 |中号 |亚当斯 |退出 | 2019-03-22 05:26:00.000 |选择参加 0 | 2222222 |黎明 |中号 |亚当斯 |选择 | 2019-04-01 15:39:00.000 |选择退出 0 | 2222222 |黎明 |中号 |亚当斯 |退出 | 2019-04-02 04:06:00.000 |选择 0 | 2222222 |黎明 |中号 |亚当斯 |选择 | 2019-04-06 11:53:00.000 |选择退出 0 | 2222222 |黎明 |中号 |亚当斯 |退出 | 2019-04-09 12:51:00.000 |选择 0 | 2222222 |黎明 |中号 |亚当斯 |选择 | 2019-04-20 15:21:00.000 |选择退出

【讨论】:

这让我非常接近,是并且是我认为我可以做的事情。但是,它似乎只为每个帐户/人带回一个 OptIn/OptOut,而不是每次更改。 @Rhonda:我不确定你在说什么。您可以在我添加到答案中的演示中看到,这会为每人带来不止一条记录。 我完全同意,确实如此,但是当我应用到我的真实数据时,它的工作方式似乎不同。我会继续努力的。 我发现了差异,我的样本数据按活动日期正确排序,实际上,我的实际数据在数据库中没有正确排序,因此滞后和超过与日期不匹配/我预期的时间。但你的答案正是我想要的,谢谢!

以上是关于选择上一个动作之后的第一个动作实例的主要内容,如果未能解决你的问题,请参考以下文章

放松转场动作的第二场转场

Delphi DBGridEH查询出内容之后,自动执行选中点击第一行的内容动作.

如何将动作从 NSToolbar 项发送到 TabViews 的第一响应者

React/Redux 在第一个动作完成后立即触发动作

在一个按钮动作中推送两个不同的视图控制器-iOS

如何一个接一个地调度两个异步 redux 动作?