Нужна помощь в создании индексированного представления с 2 COUNT_BIG

Хорошо, я пытаюсь создать индексированное представление для простой таблицы, в которой хранятся результаты того, что люди считают хорошим/плохим для публикации. Это результаты лайков/палец вниз, голосований по постам.

Итак, вот моя псевдоподдельная таблица: -

HelpfulPostId INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
PostId INT NOT NULL,
IsHelpful BIT NOT NULL,
UserId INT NOT NULL

Таким образом, пользователь может иметь только один голос за сообщение. Это либо 1 (полезно), либо 0 (бесполезно) ‹-- не уверен, что есть лучший способ справиться с этим, если есть лучший способ.

Ok. То, что я пытаюсь сделать, это получить представление, которое выглядит следующим образом.

HelpfulPostId INT IDENTITY(1,1) NOT NULL PRIMARY KEY

PostId INT NOT NULL,
IsHelpfulCount COUNT_BIG (WHERE IsHelpful = 1)
IsNotHelpfulCount COUNT_BIG (WHERE IsHelpful = 0)

И, наконец, мне нужно сделать его привязываемым к схеме, чтобы я мог добавить индекс в PK, а затем индекс в PostId.

Я понятия не имею о sql, чтобы сделать вид. Какие-либо предложения?

Ваше здоровье :)


person Pure.Krome    schedule 22.06.2009    source источник
comment
как вы можете считать count_big, когда максимальное количество строк ограничено первичным ключом int?   -  person Mitch Wheat    schedule 22.06.2009
comment
Я сделал это, потому что индексированные представления получают только значение COUNT_BIG, когда вы пытаетесь заполнить поле COUNT.   -  person Pure.Krome    schedule 22.06.2009


Ответы (1)


Мысли:

  • Вы не можете использовать COUNT(*) в индексированном представлении
  • Вы не можете агрегировать битовые поля

Существуют и другие ограничения индексированных представлений.

CREATE VIEW dbo.Example
WITH SCHEMABINDING
AS
SELECT
    PostId,
    SUM(CAST(IsHelpful AS bigint)) AS IsHelpfulCount,
    SUM(CAST(1-IsHelpful AS bigint)) AS IsNotHelpfulCount,
    COUNT_BIG(*) AS Dummy   --Used to satisfy requirement
FROM
    dbo.bob
GROUP BY
    PostId
GO
CREATE UNIQUE CLUSTERED INDEX IXC_Test ON dbo.Example (PostId)
GO

Изменить: удалено поле «Идентификация», которое было случайно добавлено к исходному вопросу/сообщению.

Изменить 2 (gbn): я забыл, что любой агрегат в индексированном представлении также нуждается в COUNT_BIG(*). Итак, просто добавьте один в качестве фиктивного столбца. Я проверил это.

Если в определении представления используется агрегатная функция, список SELECT должен также включать COUNT_BIG (*).

person gbn    schedule 22.06.2009
comment
Гм... это не сработает :( Откуда он знает, что такое счетчик IsHelpfulCount?? это то, что мне нужно определить в этом представлении :( Может ли это быть подзапросом? - person Pure.Krome; 22.06.2009
comment
С небольшой доработкой теперь все хорошо. Мне пришлось удалить поле Indentity (я случайно опубликовал это в результате ... что невозможно, когда я делаю агрегации: P). Я проверил быстрый выбор с 2-кратным подзапросом (выполнение подсчета), и все в порядке :) Мне повезло, что я использую 1 и 0 .. так что СУММА сработает :) - person Pure.Krome; 22.06.2009
comment
:( когда я пытаюсь проиндексировать это представление, оно не работает. Говорить, что мне нужен COUNT_BIG(*) ??? - person Pure.Krome; 22.06.2009
comment
.. но теперь это работает (я могу добавить уникальный кластеризованный индекс), когда я добавляю следующее в оператор select.. => COUNT_BIG(*) AS TotalCount - person Pure.Krome; 22.06.2009
comment
ваше здоровье. Подтверждено также. Отлично работает :) ура, приятель, за то, что довел дело до конца. - person Pure.Krome; 22.06.2009