Select 具有最大 ID 和特定条件的行
Select the row with the biggest ID and a specific condition
我有一个 table 具有以下结构的评论:
CommentId (int),
CommentText (nvarchar(max))
EditedBy (nvarchar(max))
ParentCommentId (int)
CaseId (int)
对于特定的 caseId
我想要 select 最新的评论文本以及 EditedBy
专栏。
例如,如果有人添加评论 table 将是
CommentId CommentText EditedBy ParentCommentId CaseId
1 ParentComment1 ABC NULL 1
2 ParentComment2 ABC NULL 1
现在,如果有人编辑该评论,table 将看起来像
CommentId CommentText EditedBy ParentCommentId CaseId
1 ParentComment1 ABC NULL 1
2 ParentComment2 ABC NULL 2
3 Comment2 DEF 1 1
此编辑可以进行任意次数
我想 select 最新的评论以及历史。
在这种情况下,我的数据集应该是这样的:
CaseId CommentId CommentText Predicate
1 3 Comment2 Created By ABC , Updated by DEF
1 2 ParentComment2 Created By ABC
这是问题的简化版本。
TIA
您可以使用 FOR XML PATH
创建谓词列。像这样。
示例数据
CREATE TABLE Comment
([CommentId] int, [CommentText] varchar(8), [EditedBy] varchar(3), [ParentCommentId] varchar(4), [CaseId] int);
INSERT INTO Comment
([CommentId], [CommentText], [EditedBy], [ParentCommentId], [CaseId])
VALUES
(1, 'Comment1', 'ABC', NULL, 1),
(2, 'Comment2', 'DEF', '1', 1);
查询
;WITH CTE AS
(
SELECT CommentID, CommentText,EditedBy,ParentCommentID,CaseID,ROW_NUMBER()OVER(PARTITION BY Caseid ORDER BY CommentID DESC) RN
FROM Comment
), CTE2 as
(
SELECT CommentID, CommentText,EditedBy,ParentCommentID,CaseID,
(
SELECT
CASE WHEN ParentCommentID IS NULL THEN 'Created By ' ELSE ', Updated By ' END
+ EditedBy
FROM CTE C1
WHERE C1.CaseID = C2.CaseID
ORDER BY CommentID ASC
FOR XML PATH('')
) as Predicate
FROM CTE C2
WHERE RN = 1
)
SELECT CaseID,CommentID, CommentText,Predicate FROM CTE2;
编辑
如果您不想为每个更新 caseid
的用户重复 Updated By
,请使用以下 CASE
CASE WHEN ParentCommentID IS NULL THEN 'Created By ' + EditedBy + ', Updated By' ELSE '' END,
CASE WHEN ParentCommentID IS NOT NULL THEN ', ' + EditedBy ELSE '' END
而不是
CASE WHEN ParentCommentID IS NULL THEN 'Created By ' ELSE ', Updated By ' END + EditedBy
输出
| CaseID | CommentID | CommentText | Predicate |
|--------|-----------|-------------|--------------------------------|
| 1 | 2 | Comment2 | Created By ABC, Updated By DEF |
编辑 2
使用递归 CTE 实现您的预期输出。像这样。
查询
;WITH CTEComment AS
(
SELECT CommentID as RootCommentID,CommentID, CommentText,EditedBy,ParentCommentID,CaseID
FROM Comment
WHERE ParentCommentID IS NULL
UNION ALL
SELECT CTEComment.RootCommentID as RootCommentID,Comment.CommentID, Comment.CommentText,Comment.EditedBy,Comment.ParentCommentID,Comment.CaseID
FROM CTEComment
INNER JOIN Comment
ON CTEComment.CommentID = Comment.ParentcommentID
AND CTEComment.CaseID = Comment.CaseID
), CTE as
(
SELECT CommentID,RootCommentID,CommentText,EditedBy,ParentCommentID,CaseID,ROW_NUMBER()OVER(PARTITION BY CaseID,RootCommentID ORDER BY CommentID DESC) RN
FROM CTEComment
), CTE2 as
(
SELECT CommentID, CommentText,EditedBy,ParentCommentID,CaseID,
(
SELECT
CASE WHEN ParentCommentID IS NULL THEN 'Created By ' ELSE ', Updated By ' END
+ EditedBy
FROM CTE C1
WHERE C1.CaseID = C2.CaseID
AND C1.RootCommentID = C2.RootCommentID
ORDER BY CommentID ASC
FOR XML PATH('')
) as Predicate
FROM CTE C2
WHERE RN = 1
)
SELECT CaseID,CommentID, CommentText,Predicate FROM CTE2;
输出
| CaseID | CommentID | CommentText | Predicate |
|--------|-----------|----------------|--------------------------------|
| 1 | 3 | Comment2 | Created By ABC, Updated By DEF |
| 2 | 2 | ParentComment2 | Created By ABC |
You can use this method
DECLARE @CaseId [int];
SET @CaseId=1`enter code here`
DECLARE @GeneratedBy [nvarchar](max);
SET @GeneratedBy=(SELECT EditBy from Comment WHERE ParentCommentId is NULL AND CaseId = @CaseId)
PRINT @GeneratedBy;
SELECT CaseId , CommentId , CommentText , 'Created By '+@GeneratedBy+ ', Updated By ' +EditBy AS Predicate FROM Comment
WHERE CaseId = @CaseId AND ParentCommentId=(SELECT max(ParentCommentId) from Comment WHERE CaseId = @CaseId)
您可以简单地使用自联接来获得结果:
找到下面的查询:
select a.CaseId,b.CommentId, b.CommentText,'Created By '+a.EditedBy +', update by '+b.EditedBy as Predicate
from Comment a
inner join Comment b
on a.CaseId=b.CaseId
where a.CommentId<b.CommentId
我有一个 table 具有以下结构的评论:
CommentId (int),
CommentText (nvarchar(max))
EditedBy (nvarchar(max))
ParentCommentId (int)
CaseId (int)
对于特定的 caseId
我想要 select 最新的评论文本以及 EditedBy
专栏。
例如,如果有人添加评论 table 将是
CommentId CommentText EditedBy ParentCommentId CaseId
1 ParentComment1 ABC NULL 1
2 ParentComment2 ABC NULL 1
现在,如果有人编辑该评论,table 将看起来像
CommentId CommentText EditedBy ParentCommentId CaseId
1 ParentComment1 ABC NULL 1
2 ParentComment2 ABC NULL 2
3 Comment2 DEF 1 1
此编辑可以进行任意次数 我想 select 最新的评论以及历史。 在这种情况下,我的数据集应该是这样的:
CaseId CommentId CommentText Predicate
1 3 Comment2 Created By ABC , Updated by DEF
1 2 ParentComment2 Created By ABC
这是问题的简化版本。 TIA
您可以使用 FOR XML PATH
创建谓词列。像这样。
示例数据
CREATE TABLE Comment
([CommentId] int, [CommentText] varchar(8), [EditedBy] varchar(3), [ParentCommentId] varchar(4), [CaseId] int);
INSERT INTO Comment
([CommentId], [CommentText], [EditedBy], [ParentCommentId], [CaseId])
VALUES
(1, 'Comment1', 'ABC', NULL, 1),
(2, 'Comment2', 'DEF', '1', 1);
查询
;WITH CTE AS
(
SELECT CommentID, CommentText,EditedBy,ParentCommentID,CaseID,ROW_NUMBER()OVER(PARTITION BY Caseid ORDER BY CommentID DESC) RN
FROM Comment
), CTE2 as
(
SELECT CommentID, CommentText,EditedBy,ParentCommentID,CaseID,
(
SELECT
CASE WHEN ParentCommentID IS NULL THEN 'Created By ' ELSE ', Updated By ' END
+ EditedBy
FROM CTE C1
WHERE C1.CaseID = C2.CaseID
ORDER BY CommentID ASC
FOR XML PATH('')
) as Predicate
FROM CTE C2
WHERE RN = 1
)
SELECT CaseID,CommentID, CommentText,Predicate FROM CTE2;
编辑
如果您不想为每个更新 caseid
的用户重复 Updated By
,请使用以下 CASE
CASE WHEN ParentCommentID IS NULL THEN 'Created By ' + EditedBy + ', Updated By' ELSE '' END,
CASE WHEN ParentCommentID IS NOT NULL THEN ', ' + EditedBy ELSE '' END
而不是
CASE WHEN ParentCommentID IS NULL THEN 'Created By ' ELSE ', Updated By ' END + EditedBy
输出
| CaseID | CommentID | CommentText | Predicate |
|--------|-----------|-------------|--------------------------------|
| 1 | 2 | Comment2 | Created By ABC, Updated By DEF |
编辑 2
使用递归 CTE 实现您的预期输出。像这样。
查询
;WITH CTEComment AS
(
SELECT CommentID as RootCommentID,CommentID, CommentText,EditedBy,ParentCommentID,CaseID
FROM Comment
WHERE ParentCommentID IS NULL
UNION ALL
SELECT CTEComment.RootCommentID as RootCommentID,Comment.CommentID, Comment.CommentText,Comment.EditedBy,Comment.ParentCommentID,Comment.CaseID
FROM CTEComment
INNER JOIN Comment
ON CTEComment.CommentID = Comment.ParentcommentID
AND CTEComment.CaseID = Comment.CaseID
), CTE as
(
SELECT CommentID,RootCommentID,CommentText,EditedBy,ParentCommentID,CaseID,ROW_NUMBER()OVER(PARTITION BY CaseID,RootCommentID ORDER BY CommentID DESC) RN
FROM CTEComment
), CTE2 as
(
SELECT CommentID, CommentText,EditedBy,ParentCommentID,CaseID,
(
SELECT
CASE WHEN ParentCommentID IS NULL THEN 'Created By ' ELSE ', Updated By ' END
+ EditedBy
FROM CTE C1
WHERE C1.CaseID = C2.CaseID
AND C1.RootCommentID = C2.RootCommentID
ORDER BY CommentID ASC
FOR XML PATH('')
) as Predicate
FROM CTE C2
WHERE RN = 1
)
SELECT CaseID,CommentID, CommentText,Predicate FROM CTE2;
输出
| CaseID | CommentID | CommentText | Predicate |
|--------|-----------|----------------|--------------------------------|
| 1 | 3 | Comment2 | Created By ABC, Updated By DEF |
| 2 | 2 | ParentComment2 | Created By ABC |
You can use this method
DECLARE @CaseId [int];
SET @CaseId=1`enter code here`
DECLARE @GeneratedBy [nvarchar](max);
SET @GeneratedBy=(SELECT EditBy from Comment WHERE ParentCommentId is NULL AND CaseId = @CaseId)
PRINT @GeneratedBy;
SELECT CaseId , CommentId , CommentText , 'Created By '+@GeneratedBy+ ', Updated By ' +EditBy AS Predicate FROM Comment
WHERE CaseId = @CaseId AND ParentCommentId=(SELECT max(ParentCommentId) from Comment WHERE CaseId = @CaseId)
您可以简单地使用自联接来获得结果:
找到下面的查询:
select a.CaseId,b.CommentId, b.CommentText,'Created By '+a.EditedBy +', update by '+b.EditedBy as Predicate
from Comment a
inner join Comment b
on a.CaseId=b.CaseId
where a.CommentId<b.CommentId