Regex 是否有一种基于WHERE表达式计算加权和的方法?

Regex 是否有一种基于WHERE表达式计算加权和的方法?,regex,sql,tsql,stackexchange,Regex,Sql,Tsql,Stackexchange,我想知道我的堆栈溢出声誉,不包括通过提问和回答问题而获得或失去的所有声誉,这对我来说就像是肮脏的金钱 堆栈交换允许我计算这个。但是,我只使用专有数据库和C++包装类编程,所以我对SQL技巧不太自信。尽管如此,我还是尝试了一下,最终得出了以下结论: -在指定标签上获得/失去的大致声誉 -只统计上升票和下降票 声明@UserId int=UserId 声明@questionsupint=0; 声明@QuestionsDown int=0; 声明@AnswersUp int=0; 声明@Answers

我想知道我的堆栈溢出声誉,不包括通过提问和回答问题而获得或失去的所有声誉,这对我来说就像是肮脏的金钱

堆栈交换允许我计算这个。但是,我只使用专有数据库和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?是否有一种方法可以压缩此查询以在一次运行中执行


如果您对语法、格式、良好实践等方面有任何辅助建议,请随时发表评论。另外,如果有其他方法可以获得或失去我没有考虑到的特定于标签的声誉,请发表评论。

您可以尝试类似的方法

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列,所有列都带有单个变量的名称,没有结果。