sql-server - 每次成员再次出现时标记为已流通
问题描述
我想标记流通量,即每次成员再次出现时。这个列表显示了我想要的结果
Sequence ID Aktivity ID From, Agent ID To, Agent ID Movement Circulated
1 001A9552444 YNGBAN TOMYAN 1 0
2 001A9552461 TOMYAN THOKIN 1 0
3 001A9552466 THOKIN MATLOV 1 0
4 001A9552486 MATLOV THOKIN 1 1
5 001A9552499 THOKIN YNGBAN 1 1
6 001A9554213 YNGBAN IKJER 1 0
创建基表的代码
DROP TABLE IF EXISTS [dbo].[Basetable]
CREATE TABLE [dbo].[Basetable] (
[Incident ID] INT,
[Activity ID] VARCHAR(50),
[Agent ID] VARCHAR(50),
)
INSERT INTO [dbo].[Basetable]
VALUES
(1072326, '001A9552444', 'YNGBAN'),
(1072326, '001A9552461', 'TOMYAN'),
(1072326, '001A9552463', 'THOKIN'),
(1072326, '001A9552464', 'THOKIN'),
(1072326, '001A9552465', 'THOKIN'),
(1072326, '001A9552466', 'THOKIN'),
(1072326, '001A9552468', 'MATLOV'),
(1072326, '001A9552484', 'MATLOV'),
(1072326, '001A9552485', 'MATLOV'),
(1072326, '001A9552486', 'MATLOV'),
(1072326, '001A9552499', 'THOKIN'),
(1072326, '001A9554212', 'YNGBAN'),
(1072326, '001A9554213', 'YNGBAN'),
(1072326, '001A9568252', 'IKJER')
以下是到目前为止的代码。我不想做 Group By 和 Count 并且尝试了 Left Join 和 Outer Apply 但还没有找到一个好的解决方案。
WITH X AS (
SELECT
ROW_NUMBER() OVER (ORDER BY [Activity ID]) AS [Sequence ID]
,[Incident ID]
,[Activity ID]
,[From, Agent ID]
,[To, Agent ID]
,1 AS [Movement]
FROM (
SELECT
[Incident ID]
,[Activity ID]
,[Agent ID] AS [From, Agent ID]
,LEAD([Agent ID],1,0) OVER (PARTITION BY [Incident ID] ORDER BY [Activity ID]) AS [To, Agent ID]
FROM [dbo].[Basetable]
) AS X
WHERE
[To, Agent ID] != '0' AND [From, Agent ID] != [To, Agent ID]
)
SELECT
X1.[Sequence ID]
,X1.[Incident ID]
,X1.[Activity ID]
,X1.[From, Agent ID]
,X1.[To, Agent ID]
,X1.[Movement]
FROM X AS X1
编辑:添加了用于创建基表的代码并清理了主要代码。
解决方案
-- Your existing query
;WITH X AS (
SELECT
ROW_NUMBER() OVER (ORDER BY [Activity ID]) AS [Sequence ID]
,[Incident ID]
,[Activity ID]
,[From, Agent ID]
,[To, Agent ID]
,1 AS [Movement]
FROM (
SELECT
[Incident ID]
,[Activity ID]
,[Agent ID] AS [From, Agent ID]
,LEAD([Agent ID],1,0) OVER (PARTITION BY [Incident ID] ORDER BY [Activity ID]) AS [To, Agent ID]
FROM [dbo].[Basetable]
) AS X
WHERE
[To, Agent ID] != '0' AND [From, Agent ID] != [To, Agent ID]
),
Y AS
(
SELECT
X1.[Sequence ID]
,X1.[Incident ID]
,X1.[Activity ID]
,X1.[From, Agent ID]
,X1.[To, Agent ID]
,X1.[Movement]
FROM X AS X1
)
-- Added this part
SELECT Y.*, CASE WHEN Z.CNT > 0 THEN 1 ELSE 0 END AS Circulated
FROM Y
CROSS APPLY
(
-- Count the occurrence of the To Agent ID appear before as `From`
SELECT CNT = COUNT(*)
FROM X
WHERE X.[Sequence ID] < Y.[Sequence ID]
AND X.[From, Agent ID] = Y.[To, Agent ID]
) Z
推荐阅读
- javascript - 如何访问中间有空格字符的firestore文档(如何转义空格字符?)
- java - executeUpdate 插入查询返回 0 但在手动插入时有效
- javascript - 如何增加维恩图工作区的大小
- apache-spark - 使用 scala 为 ElasticSearch 测试用例创建虚拟 SearchResponse 实例
- batch-file - Windows 10(64 位).bat 文件中“msg”命令的替代方法
- c# - 通过 netstat 检查端口后无法在 Asp.net 中使用端口
- c# - 配置 AspNetCore TestServer 返回 500 而不是抛出异常
- javascript - 手风琴的“咏叹调角色”应该是什么?在可访问性检查期间,我的手风琴被读取为按钮,这可能会使用户感到困惑
- angular - 用于过滤整个字符串数组的 Ag-grid 文本过滤器
- javascript - vue.js:如何在屏幕上没有呈现任何内容且控制台中没有错误时进行调试。