给定一个这样的表,
我想通过 SQL 创建一个表而不执行窗口函数
id | time| attribute1| attribute1atFirstRecordedTimeperID
1 | 0 | a | a
1 | 2 | b | a
2| 0 | c | c
2| 4 | d | c
我试过
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
列别名是否正确?
如果我修复此代码,我想让 SQL 代码适用于 id=2 没有在时间 t=0 记录其第一个 attribute1 的情况,但适用于 t>0。那么我是在连接条件上还是在连接内部做一分钟的操作呢?
我想通过 SQL 创建一个表,而不需要执行窗口函数来转
进入
去从
编号 | 时间| 属性1
1 | 0 | a
1 | 2 | b
2| 42 | c
2| 69 | d
到餐桌上
id | time| attribute1| attribute1atFirstRecordedTimeperID
1 | 0 | a | a
1 | 2 | b | a
2| 42 | c | c
2| 69 | d | c
如果你使用 row_number() 窗口函数来标记每个 id 中第一次出现的位置,那么你如何加入或者你不会使用加入而是使用其他东西?
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
问题是您正在尝试访问
attibute1
来自 的列t2
,但您为该列指定了别名attribute1fixedattime0
。因此,使用这个别名:但我不明白这个子选择的原因。您可以直接加入表:
然而,这并不能解决问题。您需要的是
time
每个的最小值id
。因此,创建一个带有 GROUP BY 的 SELECT:我们还可以选择
MIN(attribute1)
;但是,我不确定与最短时间关联的属性是否也是最短属性。但是我们可以通过另一个连接来获取这个属性:现在,我们有了最短时间及其属性
id
,可以对原始表进行最终连接:请注意,我们通常
Iff
会检查时间最短的行,然后将时间设置为 0,即使不是。我也把它放在[time]
括号里,因为它是一个保留字。