Dada uma tabela como esta,
Quero criar uma tabela via SQL sem fazer funções de janela
id | time| attribute1| attribute1atFirstRecordedTimeperID
1 | 0 | a | a
1 | 2 | b | a
2| 0 | c | c
2| 4 | d | c
tentei
SELECT
t1.id,
t1.time,
t1.attribute1,
attribute1fixedattime0 = t2.attribute1
FROM s t1
INNER JOIN (
SELECT attribute1 AS attribute1fixedattime0
FROM s
WHERE time = 0
) t2 ON t1.id = t2.id
O alias da coluna está correto?
Se eu corrigir esse código, quero fazer o código SQL funcionar para o caso em que id=2 não tem seu primeiro atributo1 registrado no tempo t=0, mas para t>0. Então faço um min na condição de join ou dentro do JOIN?
Quero criar uma tabela via SQL sem fazer funções de janela para virar
em
Para ir de
identificação | tempo| atributo1
1 | 0 | a
1 | 2 | b
2| 42 | c
2| 69 | d
para a mesa
id | time| attribute1| attribute1atFirstRecordedTimeperID
1 | 0 | a | a
1 | 2 | b | a
2| 42 | c | c
2| 69 | d | c
se você usar uma função de janela row_number() para marcar o local em que a primeira vez está dentro de cada id, então como você se junta ou não usaria uma junção, mas algo mais?
SELECT
id,
time,
attribute1,
ROW_NUMBER() OVER (PARTITION BY id ORDER BY time) AS rn
FROM your_table
SELECT
id,
time,
attribute1,
FIRST_VALUE(attribute1) OVER (PARTITION BY id ORDER BY time ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS attribute1atFirstRecordedTimeperID
FROM (
-- Previous query here
) AS subquery
O problema é que você está tentando acessar uma coluna
attibute1
det2
, mas deu a essa coluna o aliasattribute1fixedattime0
. Então, use este alias:Mas não vejo o motivo dessa subseleção. Você pode entrar na mesa diretamente:
No entanto, isso não resolve o problema. O que você precisa é do
time
valor mínimo porid
. Portanto crie um SELECT com um GROUP BY:Também poderíamos selecionar
MIN(attribute1)
; entretanto, não tenho certeza se o atributo associado ao tempo mínimo também é o atributo mínimo. Mas podemos obter esse atributo fazendo outra junção:Agora temos o tempo mínimo e seu atributo per
id
e podemos fazer a junção final com a tabela original:Observe que usamos
Iff
para verificar a linha com o tempo mínimo e, em seguida, definir o tempo como 0, mesmo que não seja. Também coloquei[time]
colchetes porque é uma palavra reservada.