Подсчет количества одиночных совпадающих записей с одинаковым значением AnswerCount в базе данных обмена стеками

Я запрашиваю базу данных Stack Exchange по адресу https://data.stackexchange.com/stackoverflow/query/new

для подсчета общего количества сообщений, имеющих такое же AnswerCountvalue, что и другое сообщение.

Это моя попытка, которая вызывает ошибку Something unexpected went wrong while running your query. Don't worry, blame is already being assigned.

Идея состоит в том, чтобы увеличить счетчик после того, как сообщение / запись в таблице Posts имеет единственное совпадение для своего значения AnswerCount с другим сообщением / записью, не считая совпадений с его собственным значением AnswerCount.

Select Count(*)
From Posts as p1
Join Posts as p2
On p2.Id = {
            Select Top 1 Id
            From p2
            Where p1.AnswerCount = p2.AnswerCount
            And p1.Id <> p2.Id
            };

Это сообщение Stack Exchange, которое я использую в качестве справочника: Как присоединиться к первой строке < / а>


person Parth Patel    schedule 29.08.2020    source источник
comment
Ваш текущий запрос - это почти перекрестное соединение, но разве это не то же самое, что количество строк с этим AnswerCount минус 1?   -  person dnoeth    schedule 29.08.2020


Ответы (2)


подсчитайте общее количество сообщений, у которых значение AnswerCount такое же, как у другого сообщения.

Ваша логика очень сложна. Количество других строк с таким же количеством ответов, что и в текущей строке, точно такое же, как количество строк с этим количеством ответов минус 1. Только если количество равно 1, другого ответа нет, поэтому:

select sum(cnt)
from
 ( -- count per AnswerCount
   Select AnswerCount, Count(*) as cnt
   From Posts
   group by AnswerCount
   having count(*) > 1 -- remove unique AnswerCount
 ) as dt

Или добавить подробности:

select sum(cnt) as answers
  ,sum(case when cnt > 1 then cnt end) as same_AnswerCount_as others
  ,sum(case when cnt = 1 then cnt end) as Unique_AnswerCount
  ,max(AnswerCount)
from
 ( 
   Select AnswerCount, Count(*) as cnt
   From Posts
   group by AnswerCount
 ) as dt

Кстати, в настоящее время Data Explorer не выводит это сообщение об ошибке даже для самых простых запросов.

person dnoeth    schedule 29.08.2020

Ваша логика на правильном пути, но я бы использовал здесь:

SELECT COUNT(*)
FROM Posts p1
WHERE EXISTS (SELECT 1 FROM Posts p2
              WHERE p2.Id <> p1.Id AND p2.AnswerCount = p1.AnswerCount);

В приведенном выше запросе, читаемом на простом английском языке, говорится, что нужно подсчитать каждую запись сообщения, для которой мы можем найти другую запись сообщения с таким же AnswerCount значением с помощью другого Id значения (подразумевая это это другая запись).

person Tim Biegeleisen    schedule 29.08.2020
comment
Как вернуть только одну запись (я не могу использовать Top 1 в подзапросе) вместо нескольких записей, возвращаемых Select 1... - person Parth Patel; 29.08.2020
comment
SELECT 1 не возвращает несколько записей, и фактически EXISTS прекратит сканирование таблицы, как только найдет единственную совпадающую запись. Крайнего случая, о котором вы беспокоитесь, на самом деле нет. - person Tim Biegeleisen; 29.08.2020