Estou trabalhando em um programa que "prevê" a próxima tupla possível em uma tabela.
Uma das características seria a descoberta de progressões aritméticas, existem diferentes maneiras de fazer isso:
- Usando
System.Data.DataTable
, verifique oDataTable.Columns[i].AutoIncrement
(estou trabalhando em .Net (C#)) - Usando índices
- Encontrar progressões aritméticas nos dados reais
Esta pergunta é sobre a última parte. Eu sou capaz de obter todos os dados de uma coluna, baixá-los em uma lista e verificar se há uma progressão aritmética na lista baixada, mas estou querendo saber se existe uma maneira SQL simples de fazer isso, por exemplo:
SELECT MAX(Col1 - Previous_Tupple.Col1) FROM Table1
SELECT MIN(Col1 - Previous_Tupple.Col1) FROM Table1
Se ambos os resultados forem iguais (e não zero), então tenho uma progressão aritmética Col1
de Table1
.
Já encontrei uma forma de acessar tupples anteriores e seguintes, usando as funções LAG
e LEAD
SQL, da seguinte forma:
SELECT
t.Col1 - LAG(t.Col1) OVER (ORDER BY t.Col1)
FROM Table1 t
Agora só tenho dois problemas para resolver:
- Eu tentei, muito ingenuamente, lançar esta consulta:
SELECT MAX(t.Col1 - LAG(t.Col1) OVER (ORDER BY t.Col1)) FROM Table1 t
Isso falhou:Msg 4109, Level 15, Windowed functions cannot be used in the context of another windowed function or aggregate.
- No caso da primeira tupla,
LAG
retornaNULL
, então isso pode impactarMAX
e osMIN
cálculos
Então, minha pergunta é: como eu calculo o MAX
and MIN
da minha LAG
consulta SQL baseada, enquanto descarto o irritante NULL
-valor?
Será muito mais fácil responder se você fornecer DDL e alguns dados de exemplo, de preferência como um Fiddle . No entanto, você deve poder aninhar sua consulta como:
não testado
Para NULL você precisa determinar como interpretá-lo. Uma maneira é atribuir o elemento de identidade para adição:
Outra é filtrar no nível externo: