2011-08-08 36 views
3

这可能看起来像一个Meta问题,但它实际上是关于SQL的。如何将两个SEDE(SQL)查询用作第三个查询的输入?

我很好奇堆栈溢出的数量和帖子都是upvoted和downvoted。我试图拼凑一个Data Explorer查询来找出,但无法使其工作。

我写了下面的子查询找到的职位有一定数量upvotes的:

SELECT PostId as [Post Link], COUNT(v.PostId) AS 'Upvote count' 
FROM Votes v 
INNER JOIN Posts p 
ON p.Id=v.PostId 
WHERE PostTypeId = 1 
    AND VoteTypeId = 2 
GROUP BY v.PostId 
HAVING COUNT(v.PostId) > 5 

我使用一个类似的downvotes。

我不知道的是如何编写一个查询,它只返回那些出现在两个子查询结果中的帖子。我所有的尝试都是语法错误。有什么我想要做的事情,我可以流行到谷歌?也许是特殊的运营商或关键字?

回答

1

如果你的意思是你想拉有upvotes的具体数量以及downvotes特定数量的答案,那么请尝试以下方法:

SELECT 
    PostId as [Post Link], 
    COUNT(CASE VoteTypeId WHEN 2 THEN v.PostId END) AS 'Upvote count', 
    COUNT(CASE VoteTypeId WHEN 3 THEN v.PostId END) AS 'Downvote count' 
FROM Votes v 
INNER JOIN Posts p 
ON p.Id=v.PostId 
WHERE PostTypeId = 1 
    AND VoteTypeId IN (2, 3) 
GROUP BY v.PostId 
HAVING COUNT(CASE VoteTypeId WHEN 2 THEN v.PostId END) > 150 
    AND COUNT(CASE VoteTypeId WHEN 3 THEN v.PostId END) > 10 

这将选择那些有答案同时提供超过150个赞助和10多个降价。

0

作为替代方案,在Stack Exchange Data Explorer发现:

set nocount on 

declare @VoteStats table (PostId int, up int, down int) 

insert @VoteStats 
select 
    PostId, 
    up = sum(case when VoteTypeId = 2 then 1 else 0 end), 
    down = sum(case when VoteTypeId = 3 then 1 else 0 end) 
from Votes 
where VoteTypeId in (2,3) 
group by PostId 

set nocount off 

select top 100 p.id as [Post Link] , up, down from @VoteStats 
join Posts p on PostId = p.Id 
where down > (up * 0.5) and p.CommunityOwnedDate is null and p.ClosedDate is null 
order by up desc