AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 266242
Accepted
mustaccio
mustaccio
Asked: 2020-05-01 18:21:07 +0800 CST2020-05-01 18:21:07 +0800 CST 2020-05-01 18:21:07 +0800 CST

Função de janela condicional com uma torção -- inclua no máximo X linhas anteriores, mas exclua algumas

  • 772

Pedindo para um amigo que usa SQL Server Parallel Warehouse.

They™ tem uma tabela de valores de vendas semanais, assim (perdoe a justificativa imprópria da coluna):

+-------+------------+
| week  |  amount    |
+-------+------------+
|    1  | 100.00     |
|    2  | 100.00     |
|    3  | 100.00     |
|    4  | 100.00     |
|    5  | 100000.00  |
|    6  | 100.00     |
|    7  | 50000.00   |
|    8  | 50000.00   |
|    9  | 50000.00   |
|   10  | 100.00     |
+-------+------------+

E também uma lista de semanas "ruins", por exemplo

+------+
| week |
+------+
|    5 |
|    7 |
|    8 |
|    9 |
+------+

E They™ precisa selecionar para cada semana, incluindo semanas "ruins", a soma das vendas das quatro semanas anteriores não "ruins" , ou seja, indo o mais longe possível, pulando registros de semanas "ruins", para somar no máximo quatro valores de vendas. Assim, o resultado esperado seria:

+-------+------------+
| week  | sum_not_bad|
+-------+------------+
|    1  | null       |
|    2  | 100.00     |
|    3  | 200.00     |
|    4  | 300.00     |
|    5  | 400.00     |
|    6  | 400.00     |
|    7  | 400.00     |
|    8  | 400.00     |
|    9  | 400.00     |
|   10  | 400.00     |
+-------+------------+

Eu tenho um violino que acho que um passo na direção certa, mas não consigo descobrir o(s) próximo(s) passo(s).

Alguém tem insights?

sql-server window-functions
  • 2 2 respostas
  • 305 Views

2 respostas

  • Voted
  1. Sabin B
    2020-05-01T21:45:02+08:002020-05-01T21:45:02+08:00
    SELECT * 
    FROM data as d
      OUTER APPLY
      (
          SELECT SUM(prev_amount) as sum_not_bad
          FROM
              (SELECT TOP(4) (p.amount)as prev_amount
               FROM data as p
                   LEFT JOIN bad_weeks as b
                        ON p.week = b.week
               WHERE p.week < d.week
                    AND b.week is null
               ORDER BY p.week DESC
              )a
      )oa
    

    resultado

    week        amount                                  sum_not_bad
    1           100.00                                  NULL
    2           100.00                                  100.00
    3           100.00                                  200.00
    4           100.00                                  300.00
    5           100000.00                               400.00
    6           100.00                                  400.00
    7           50000.00                                400.00
    8           50000.00                                400.00
    9           50000.00                                400.00
    10          100.00                                  400.00
    

    dbfiddle

    • 4
  2. Best Answer
    Martin Smith
    2020-05-01T19:32:53+08:002020-05-01T19:32:53+08:00

    Aqui está uma maneira, ele usa PARTITIONpara agrupar todas as boas semanas e obter a contagem cumulativa de boas para as 4 boas semanas anteriores. Em seguida, uma abordagem ao longo das linhas da Solução 2 Usando Concatenação aqui para contornar a falta de suporte para LAST_VALUEignorar NULLs e cascata para baixo o valor "bom" anterior.

    Ele mantém o controle de duas somas cumulativas. Uma incluindo a linha atual (usada pela próxima linha se a linha "próxima" estiver ruim) e outra sem a linha atual.

    WITH T
         AS (SELECT d.week,
                    d.amount,
                    CASE WHEN b.week IS NULL THEN 0 ELSE 1 END AS is_bad_week,
                    SUM(CASE WHEN b.week IS NULL THEN d.amount END)
                      OVER ( PARTITION BY CASE WHEN b.week IS NULL THEN 0 ELSE 1 END ORDER BY d.week rows BETWEEN 4 PRECEDING AND 1 PRECEDING) cume_sum_prev4toprev1,
                    SUM(CASE WHEN b.week IS NULL THEN d.amount END)
                      OVER ( PARTITION BY CASE WHEN b.week IS NULL THEN 0 ELSE 1 END ORDER BY d.week rows BETWEEN 3 PRECEDING AND CURRENT ROW) cume_sum_prev3tocurrent
             FROM   data d
                    LEFT JOIN bad_weeks b
                           ON d.week = b.week)
    SELECT week,
           CASE WHEN is_bad_week = 1 THEN 
           CAST(SUBSTRING(MAX(RIGHT(CONCAT('0000000000', week), 10) + CAST(cume_sum_prev3tocurrent AS VARCHAR(20))) OVER (ORDER BY week), 11, 20) AS DECIMAL(20, 2)) 
           ELSE
           CAST(SUBSTRING(MAX(RIGHT(CONCAT('0000000000', week), 10) + CAST(cume_sum_prev4toprev1 AS VARCHAR(20))) OVER (ORDER BY week), 11, 20) AS DECIMAL(20, 2))
           END AS sum_not_bad
    FROM   T
    ORDER  BY week 
    
    • 3

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve