Precisa de ajuda para fazer uma visão indexada com 2 count_big's
-
06-07-2019 - |
Pergunta
Ok, estou tentando fazer uma visão indexada contra uma tabela simples que armazena os resultados do que as pessoas pensam ser bom/ruim para uma postagem. Este é o resultado de um polegar para cima / polegar para baixo, votando nos cargos.
Então aqui está minha mesa falsa PSEDUO:-
HelpfulPostId INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
PostId INT NOT NULL,
IsHelpful BIT NOT NULL,
UserId INT NOT NULL
Portanto, um usuário pode ter apenas um voto por post. É 1 (útil) ou 0 (inútil) <- não tenho certeza de uma maneira melhor de lidar com isso, se houver uma maneira melhor.
OK. O que estou tentando fazer é obter uma visão que se parece com o seguinte.
HELWFLEFOSTID INT Identidade (1,1) Não é a chave primária nula,
PostId INT NOT NULL,
IsHelpfulCount COUNT_BIG (WHERE IsHelpful = 1)
IsNotHelpfulCount COUNT_BIG (WHERE IsHelpful = 0)
E, finalmente, precisarei torná -lo esquema para adicionar um índice no PK e, em seguida, um índice no postid.
Não tenho idéia do SQL para fazer a vista. Alguma sugestão?
Felicidades :)
Solução
Pensamentos:
- Você não pode usar a contagem (*) em uma visão indexada
- Você não pode agregar campos de bits
Ha outro Limitações de visualizações indexadas
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
Editar: removeu o campo de identidade, que foi adicionado acidentalmente à pergunta/post original.
EDIT 2 (GBN): esqueci que qualquer agregado em uma visão indexada também precisa de um count_big (*). Portanto, basta adicionar um como uma coluna fictícia. Eu testei isso.
Se a definição de visualização usar uma função agregada, a lista de seleção também deverá incluir count_big (*).