Regex 是否有一种基于WHERE表达式计算加权和的方法?
我想知道我的堆栈溢出声誉,不包括通过提问和回答问题而获得或失去的所有声誉,这对我来说就像是肮脏的金钱 堆栈交换允许我计算这个。但是,我只使用专有数据库和C++包装类编程,所以我对SQL技巧不太自信。尽管如此,我还是尝试了一下,最终得出了以下结论: -在指定标签上获得/失去的大致声誉 -只统计上升票和下降票 声明@UserId int=UserId 声明@questionsupint=0; 声明@QuestionsDown int=0; 声明@AnswersUp int=0; 声明@AnswersDown int=0; 声明@Tag nvarchar25='regex'; 选择 @问题SUP=计数* 来自标签 PostTags.TagId=Tags.id上的内部连接PostTags Posts.ParentId=PostTags.PostId上的内部联接帖子 vots.PostId=Posts.Id和VoteTypeId=2上的内部联接投票 哪里 Posts.OwnerUserId=@UserId和 Posts.PostTypeId=1和 Tags.TagName=@Tag 选择 @问题下降=计数* 来自标签 PostTags.TagId=Tags.id上的内部连接PostTags Posts.ParentId=PostTags.PostId上的内部联接帖子 vots.PostId=Posts.Id和VoteTypeId=3上的内部联接投票 哪里 Posts.OwnerUserId=@UserId和 Posts.PostTypeId=1和 Tags.TagName=@Tag 选择 @AnswersUp=计数* 来自标签 PostTags.TagId=Tags.id上的内部连接PostTags Posts.ParentId=PostTags.PostId上的内部联接帖子 vots.PostId=Posts.Id和VoteTypeId=2上的内部联接投票 哪里 Posts.OwnerUserId=@UserId和 Posts.PostTypeId=2和 Tags.TagName=@Tag 选择 @AnswersDown=计数* 来自标签 PostTags.TagId=Tags.id上的内部连接PostTags Posts.ParentId=PostTags.PostId上的内部联接帖子 vots.PostId=Posts.Id和VoteTypeId=3上的内部联接投票 哪里 Posts.OwnerUserId=@UserId和 Posts.PostTypeId=2和 Tags.TagName=@Tag 选择@QuestionsUp*5+ @答复*10+ @问题下降+@AnswersDown*-2 不过,这不可能是最好的。四个独立的查询,只需将投票结果向上的问题加权5,将投票结果向上的答案加权10,将投票结果向下的问题和答案加权2?是否有一种方法可以压缩此查询以在一次运行中执行Regex 是否有一种基于WHERE表达式计算加权和的方法?,regex,sql,tsql,stackexchange,Regex,Sql,Tsql,Stackexchange,我想知道我的堆栈溢出声誉,不包括通过提问和回答问题而获得或失去的所有声誉,这对我来说就像是肮脏的金钱 堆栈交换允许我计算这个。但是,我只使用专有数据库和C++包装类编程,所以我对SQL技巧不太自信。尽管如此,我还是尝试了一下,最终得出了以下结论: -在指定标签上获得/失去的大致声誉 -只统计上升票和下降票 声明@UserId int=UserId 声明@questionsupint=0; 声明@QuestionsDown int=0; 声明@AnswersUp int=0; 声明@Answers
如果您对语法、格式、良好实践等方面有任何辅助建议,请随时发表评论。另外,如果有其他方法可以获得或失去我没有考虑到的特定于标签的声誉,请发表评论。您可以尝试类似的方法
SELECT
SUM(
CASE
WHEN VoteTypeId = 2 AND Posts.PostTypeId = 1
THEN 1
ELSE 0
END
) QuestionsUp,
SUM(
CASE
WHEN VoteTypeId = 3 AND Posts.PostTypeId = 1
THEN 1
ELSE 0
END
) QuestionsDown,
SUM(
CASE
WHEN VoteTypeId = 2 AND Posts.PostTypeId = 2
THEN 1
ELSE 0
END
) AnswersUp,
SUM(
CASE
WHEN VoteTypeId = 3 AND Posts.PostTypeId = 2
THEN 1
ELSE 0
END
) AnswersDown
FROM Tags
INNER JOIN PostTags ON PostTags.TagId = Tags.id
INNER JOIN Posts ON Posts.ParentId = PostTags.PostId
INNER JOIN Votes ON Votes.PostId = Posts.Id
WHERE
Posts.OwnerUserId = @UserId and
Tags.TagName = @Tag
;WITH Vals AS (
SELECT
SUM(
CASE
WHEN VoteTypeId = 2 AND Posts.PostTypeId = 1
THEN 1
ELSE 0
END
) QuestionsUp,
SUM(
CASE
WHEN VoteTypeId = 3 AND Posts.PostTypeId = 1
THEN 1
ELSE 0
END
) QuestionsDown,
SUM(
CASE
WHEN VoteTypeId = 2 AND Posts.PostTypeId = 2
THEN 1
ELSE 0
END
) AnswersUp,
SUM(
CASE
WHEN VoteTypeId = 3 AND Posts.PostTypeId = 2
THEN 1
ELSE 0
END
) AnswersDown
FROM Tags
INNER JOIN PostTags ON PostTags.TagId = Tags.id
INNER JOIN Posts ON Posts.ParentId = PostTags.PostId
INNER JOIN Votes ON Votes.PostId = Posts.Id
WHERE
Posts.OwnerUserId = @UserId and
Tags.TagName = @Tag
)
SELECT QuestionsUp * 5 +
AnswersUp * 10 +
(QuestionsDown + AnswersDown) * -2
FROM Vals
编辑:
您可以使用CTE,然后使用计算中的列
差不多
SELECT
SUM(
CASE
WHEN VoteTypeId = 2 AND Posts.PostTypeId = 1
THEN 1
ELSE 0
END
) QuestionsUp,
SUM(
CASE
WHEN VoteTypeId = 3 AND Posts.PostTypeId = 1
THEN 1
ELSE 0
END
) QuestionsDown,
SUM(
CASE
WHEN VoteTypeId = 2 AND Posts.PostTypeId = 2
THEN 1
ELSE 0
END
) AnswersUp,
SUM(
CASE
WHEN VoteTypeId = 3 AND Posts.PostTypeId = 2
THEN 1
ELSE 0
END
) AnswersDown
FROM Tags
INNER JOIN PostTags ON PostTags.TagId = Tags.id
INNER JOIN Posts ON Posts.ParentId = PostTags.PostId
INNER JOIN Votes ON Votes.PostId = Posts.Id
WHERE
Posts.OwnerUserId = @UserId and
Tags.TagName = @Tag
;WITH Vals AS (
SELECT
SUM(
CASE
WHEN VoteTypeId = 2 AND Posts.PostTypeId = 1
THEN 1
ELSE 0
END
) QuestionsUp,
SUM(
CASE
WHEN VoteTypeId = 3 AND Posts.PostTypeId = 1
THEN 1
ELSE 0
END
) QuestionsDown,
SUM(
CASE
WHEN VoteTypeId = 2 AND Posts.PostTypeId = 2
THEN 1
ELSE 0
END
) AnswersUp,
SUM(
CASE
WHEN VoteTypeId = 3 AND Posts.PostTypeId = 2
THEN 1
ELSE 0
END
) AnswersDown
FROM Tags
INNER JOIN PostTags ON PostTags.TagId = Tags.id
INNER JOIN Posts ON Posts.ParentId = PostTags.PostId
INNER JOIN Votes ON Votes.PostId = Posts.Id
WHERE
Posts.OwnerUserId = @UserId and
Tags.TagName = @Tag
)
SELECT QuestionsUp * 5 +
AnswersUp * 10 +
(QuestionsDown + AnswersDown) * -2
FROM Vals
哦,太好了!有没有一种方法可以完全消除QuestionsUp、QuestionsDown、AnswersUp、AnswersDown变量,并在SELECT中进行整个计算?最后我只需要加权分数的总和。我试着用相应的分数5、-2、10、-2替换当时的1,并将所有目标设置为一个变量—但这只为我返回了4列,所有列都带有单个变量的名称,没有结果。