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

StackOverflow https://stackoverflow.com/questions/1025507

Вопрос

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

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

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

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

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

HelpfulPostId INT IDENTITY (1,1) НЕ НУЛЕВОЙ ПЕРВИЧНЫЙ КЛЮЧ,

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

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

Я понятия не имею о SQL для создания представления.Какие-либо предложения?

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

Это было полезно?

Решение

Мысли:

  • Вы не можете использовать 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(*).Итак, просто добавьте его в качестве фиктивного столбца.Я проверил это.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top