Saturday 21 October 2017

Sql Moving Average Over


Estou trabalhando com o SQL Server 2008 R2, tentando calcular uma média móvel. Para cada registro na minha opinião, eu gostaria de coletar os valores dos 250 registros anteriores e, em seguida, calcular a média para esta seleção. As colunas de exibição são as seguintes: TransactionID é exclusivo. Para cada TransactionID. Eu gostaria de calcular a média para o valor da coluna, sobre os anteriores 250 registros. Portanto, para TransactionID 300, coletar todos os valores de 250 linhas anteriores (exibição é ordenada decrescente por TransactionID) e, em seguida, na coluna MovAvg escrever o resultado da média desses valores. Eu estou olhando para coletar dados dentro de um intervalo de registros. Pediu Oct 28 14 em 20: 58Eu estou tentando calcular de forma eficiente (usando o SQL Server 2008) a média móvel do ProductCount durante um período de 24 horas. Para cada linha na tabela de produtos, gostaria de saber qual foi a média de ProductCount (para esses produtos) nas últimas 24 horas. Um problema com nossos dados é que nem todas as datas / horas estão presentes (veja o exemplo abaixo). Se um TimeStamp está faltando, significa que o ProductCount foi 0. Eu tenho uma tabela com milhões ou linhas com uma data, produto e contagem. Abaixo está um exemplo simplificado dos dados que eu tenho que lidar. Qualquer idéia sobre como conseguir esse EDIT. Um outro pedaço de dados que eu preciso é o MIN e MAX ProductCount para o período (ou seja, 24h). Calculando uma média móvel SQL sem uma atualização de cursor: Se você estiver trabalhando com as versões mais recentes do SQL Server, você pode usar as funções de janelas para realizar a mesma coisa . Eu postei o código atualizado no final do post. Para este vídeo, eu ainda gosto do processo de pensamento de ancorar a uma data. Vídeo: média móvel de 3 dias em SQL Uma maneira eficiente de calcular uma média móvel em SQL usando alguns truques para definir âncoras de data. Há debates sobre a melhor maneira de fazer um SQL Moving Average no SQL Server. Algumas pessoas pensam que há momentos em que um cursor é mais eficiente. Outros acham que você pode fazer tudo de uma maneira baseada em set sem o cursor. No outro dia eu estava indo para calcular uma média móvel e meu primeiro pensamento foi usar um cursor. Eu fiz algumas pesquisas rápidas e encontrei esta pergunta do fórum: Moving Average no TSQL Há uma postagem que mostra uma subconsulta com uma data de âncora para ajudar a encontrar o deslocamento de 1 e 2 dias. Aqui está o script que você pode usar para testar o resultado final do SQL Moving Average de 3 dias. Aqui está a consulta final. Aqui está a consulta que você usaria com o SQL Server 2012. Compartilhe: Eu tenho dados como abaixo (com 30.000 itens diferentes) e enquanto eu ainda não tenho 12 meses de dados semanais quero criar uma média móvel para os últimos 12 meses (DATEADD (aaaa, -1, GETDATE ())). Isso será executado a cada semana para capturar o nosso nível de estoque médio para os últimos 12 meses contra cada item. Além disso, eu preciso executar retrospectivamente isso para atualizar os registros que eu tenho atualmente (valor de 30 semanas para cada item atualmente). A retrospectiva precisa ter uma média apenas até a data do registro foi capturado, então para a primeira data o item seria a média de um registro e para a segunda data, dois registros, etc (eu estou pensando a atualização atual iria Precisa de T-SQL diferente do trabalho semanal futuro). Os dados se parecem com isto (a coluna à direita mostra como deve parecer.) De Date ItemNo Value 12mAve 01/06/2008 00:00 0003E 285.6465 285.6465 08/06/2008 00:00 0003E 377.9624 331.8045 15 / 06/2008 00:00 0003E 377.9624 347.1904 22/06/2008 00:00 0003E 377.9624 354.8834 29/06/2008 00:00 0003E 283.4718 340.6011 06/07/2008 00:00 0003E 283.4718 331.0796 13/07/2008 00:00 0003E 283,4718 324,2784 20/07/2008 00:00 0003E 188.9812 307.3663 27/07/2008 00:00 0003E 188.9812 294.2124 03/08/2008 00:00 0003E 188.9812 283.6893 10/08/2008 00:00 0003E 567.0228 309.4469 17/08 / 2008 00:00 0003E 567.0228 330.9115 24/08/2008 00:00 0003E 567.0228 349.0739 31/08/2008 00:00 0003E 567.0228 364.6417 07/09/2008 00:00 0003E 567.0228 378.1338 14/09/2008 00:00 0003E 567.0228 389.9393 21/09/2008 00:00 0003E 472.5190 394.7970 nickhodge (20-02-2009) Obrigado pela sua ajuda. Eu tenho este T-SQL real, mas ele expira (Timeout expirou). (Eu tenho que calcular o valor de inventário, mas tentei em uma tabela de teste com que pré-calculado, mesmo problema). A única coisa que eu posso ver é que ele adiciona OUTER automaticamente, mas thats provavelmente o padrão SELECT a. ItemNo, a. Date, AVG (b. QOH b. AveCost) AS 12mAve FROM dbo. WeeklyLoc1InventoryData como um LEFT OUTER JOIN dbo. WeeklyLoc1InventoryData AS b ON a. ItemNo a. ItemNo E b. Date gt DATEADD (m, - 12, a. Date) E b. Date lt a. Date GRUPO por a. ItemNo, a. Date Qualquer pistas (eu só espero eu havent Tenho algo errado no T-SQL, mas não acho que tenho) em um. ItemNo a. ItemNo --Jeff Moden RBAR é pronunciado ree-bar e é um Modenismo para R ow - B y-A gonizing-R ow. Primeiro passo para a mudança de paradigma da escrita Set Based código: Pare de pensar sobre o que você quer fazer a uma linha. Pense, em vez disso, do que você quer fazer para uma coluna. Links Úteis: Como Postar Problemas de Código Como Postar Cláusula de PerformanceOVER Cláusula (Transact-SQL) PARTIÇÃO BY Divide o conjunto de resultados de consulta em partições. A função de janela é aplicada a cada partição separadamente ea computação reinicia para cada partição. Valueexpression Especifica a coluna pela qual o conjunto de linhas é particionado. Valueexpression só pode se referir a colunas disponibilizadas pela cláusula FROM. Valueexpression não pode se referir a expressões ou aliases na lista de seleção. Valueexpression pode ser uma expressão de coluna, subconsulta escalar, função escalar ou variável definida pelo usuário. LtORDER BY clausegt Define a ordem lógica das linhas dentro de cada partição do conjunto de resultados. Ou seja, especifica a ordem lógica na qual o cálculo de função da janela é executado. Orderbyexpression Especifica uma coluna ou expressão na qual classificar. Orderbyexpression só pode se referir a colunas disponibilizadas pela cláusula FROM. Um inteiro não pode ser especificado para representar um nome de coluna ou alias. COLLATE collationname Especifica que a operação ORDER BY deve ser executada de acordo com o agrupamento especificado em collationname. Collationname pode ser um nome de agrupamento do Windows ou um nome de agrupamento SQL. Para obter mais informações, consulte Collation e Suporte Unicode. COLLATE é aplicável apenas para colunas de tipo char. Varchar. Nchar. E nvarchar. ASC DESC Especifica que os valores na coluna especificada devem ser classificados em ordem crescente ou decrescente. ASC é a ordem de classificação padrão. Os valores nulos são tratados como os valores mais baixos possíveis. Aplica-se a . SQL Server 2012 através do SQL Server 2016. Limita ainda mais as linhas dentro da partição especificando pontos de início e de fim dentro da partição. Isso é feito especificando um intervalo de linhas com relação à linha atual, quer por associação lógica ou associação física. A associação física é obtida usando a cláusula ROWS. A cláusula ROWS limita as linhas dentro de uma partição especificando um número fixo de linhas que precedem ou seguem a linha atual. Como alternativa, a cláusula RANGE limita logicamente as linhas dentro de uma partição especificando um intervalo de valores em relação ao valor na linha atual. As linhas precedentes e seguintes são definidas com base na ordenação na cláusula ORDER BY. A moldura de janela RANGE CURRENT ROW inclui todas as linhas que têm os mesmos valores na expressão ORDER BY como a linha atual. Por exemplo, ROWS ENTRE 2 ROUND ANTERIORES E CURRENT significa que a janela de linhas em que a função opera é de três linhas de tamanho, começando com 2 linhas precedendo até e incluindo a linha atual. ROWS ou RANGE requer que a cláusula ORDER BY seja especificada. Se ORDER BY contiver várias expressões de ordem, CURRENT ROW FOR RANGE considera todas as colunas na lista ORDER BY ao determinar a linha atual. Aplica-se a . SQL Server 2012 através do SQL Server 2016. Especifica que a janela começa na primeira linha da partição. UNBOUNDED PRECEDING só pode ser especificado como ponto de partida da janela. Ltunsigned value specificationgt PRECEDING Especificado com ltunsigned value specificationgtpara indicar o número de linhas ou valores para preceder a linha atual. Esta especificação não é permitida para RANGE. Aplica-se a . SQL Server 2012 através do SQL Server 2016. Especifica que a janela começa ou termina na linha atual quando usada com ROWS ou o valor atual quando usado com RANGE. ROUND CURRENT pode ser especificado como ponto inicial e final. ENTRE ltwindow frame bound gt E ltwindow frame bound gt Aplica-se a. SQL Server 2012 através do SQL Server 2016. Utilizado com ROWS ou RANGE para especificar os pontos de limite inferior (inicial) e superior (final) da janela. Ltwindow frame boundgt define o ponto de partida de limite e ltwindow frame boundgt define o ponto final de fronteira. O limite superior não pode ser menor do que o limite inferior. Aplica-se a . SQL Server 2012 através do SQL Server 2016. Especifica que a janela termina na última linha da partição. UNBOUNDED SIGUIENTE só pode ser especificado como um ponto final da janela. Por exemplo RANGE ENTRE ROW CURRENT E UNBOUNDED FOLLOWING define uma janela que começa com a linha atual e termina com a última linha da partição. Ltunsigned value specificationgt FOLLOWING Especificado com ltunsigned value specificationgt para indicar o número de linhas ou valores a seguir à linha atual. Quando ltunsigned valor especificação gt FOLLOWING é especificado como o ponto de partida da janela, o ponto final deve ser ltunsigned valor specificationgtFOLLOWING. Por exemplo, ROWS ENTRE 2 SEGUINTE E SEGUINTE 10 define uma janela que começa com a segunda linha que segue a linha atual e termina com a décima linha que segue a linha atual. Esta especificação não é permitida para RANGE. Unsigned integer literal Aplica-se a. SQL Server 2012 através do SQL Server 2016. É um literal inteiro positivo (incluindo 0) que especifica o número de linhas ou valores para preceder ou seguir a linha ou valor atual. Esta especificação é válida apenas para ROWS.

No comments:

Post a Comment