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_uuid
和changed_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 - 过滤掉包含具有特定值的行的分区或行组