SQL Server:仅过滤包含特定文本的行之后的行

Posted

技术标签:

【中文标题】SQL Server:仅过滤包含特定文本的行之后的行【英文标题】:SQL Server: Filter for only the rows directly after a row containing specific text 【发布时间】:2017-07-10 06:28:04 【问题描述】:

我有一个包含以下列的表格

application_uuid
changed_at_utc
changed_by 
name

我想按application_uuidchanged_at_utc 排序。然后,我想只过滤紧跟在application_status 具有文本'Ready for Scoring'的行之后的行

使用 Python 和 Pandas,我会做这样的事情......

application_statuses = application_statuses.sort_values(['application_uuid', 'changed_at_utc'], ascending=[True, True]).reset_index(drop=True)
indexes = application_statuses[application_statuses['application_status']=='Ready for Scoring'].index + 1
next_statuses = application_statuses.ix[indexes]

如何使用 SQL 做同样的事情?

【问题讨论】:

你能展示一些示例数据和预期的结果吗? 【参考方案1】:

根据您的解释,您可以使用lead 函数来执行此操作。

select next_application_status,application_uuid,changed_at_utc,changed_by
from (select t.*,
      lead(application_status) over(order by application_uuid,changed_at_utc) as next_appliaction_status
      from tablename t
      ) t1
where application_status = 'Ready for Scoring'

如果必须为每个 application_uuid 执行此操作,请在 lead 中包含 partition by,如下所示。

select next_application_status,application_uuid,changed_at_utc,changed_by
from (select t.*,
      lead(application_status) over(partition by application_uuid order by changed_at_utc) as next_appliaction_status
      from tablename t
      ) t1
where application_status = 'Ready for Scoring'

如果您需要 所有 application_status Ready for Scoring 之后的行,请获取该特定行的时间戳并选择所有其他更大的时间戳。这假设 application_uuid 最多有一行 Ready for Scoring 状态。

select application_status,application_uuid,changed_at_utc,changed_by
from (select t.*,
      max(case when application_status='Ready for Scoring' then changed_at_utc end) over(partition by application_uuid) as status_time
      from tablename t
      ) t1
where changed_at_utc > status_time

【讨论】:

非常感谢!这正是我想要的

以上是关于SQL Server:仅过滤包含特定文本的行之后的行的主要内容,如果未能解决你的问题,请参考以下文章

Oracle SQL - 过滤掉包含具有特定值的行的分区或行组

SQL内容补充

SQL Server:如何在总行数和仅包含数据的行数之间得到差异

Sql

SQL Server 仅使用最近的值选择不同的行

查询以将在特定地理距离内的行返回到给定行(使用 sql server 2008)