鉴于下面显示的两个表,我需要为每个站检索VAL_MINUTES
表中的最新值
N_STATION
| CODE_STAS | NOM_STATION | RIVIERE_BASSIN | LAMBERT_X | LAMBERT_Y |
|-----------|-------------|----------------|-----------|-----------|
| 5634 | StationA | RiverA | 50 | 60 |
| 2113 | StationB | RiverB | 55 | 95 |
VAL_MINUTES
| CODE_MESURE | DATE_VAL | M_05 | M_10 | M_15 | M_20 | M_25 | M_30 |
|-------------|------------|------|------|------|------|------|------|
| 563484 | 22/11/2016 | 0.02 | 0.35 | 0.48 | 0.2 | 0.65 | 0.45 |
| 563484 | 23/11/2016 | 1.2 | 0.9 | 1.15 | 0.84 | 0.89 | 1.02 |
| 563484 | 23/11/2016 | 1.2 | 0.9 | 1.15 | 0.84 | 0.89 | 1.02 |
| 211374 | 22/11/2016 | 0.03 | 0.1 | 0.24 | 0.21 | 0.18 | 0.19 |
结果预期
| CODE_STAS | DATE_VAL | M_05 | M_10 | M_15 | M_20 | M_25 | M_30 | NOM_STATION | RIVIERE_BASSIN | LAMBERT_X | LAMBERT_Y |
|-----------|------------|------|------|------|------|------|------|-------------|----------------|-----------|-----------|
| 5634 | 23/11/2016 | 1.2 | 0.9 | 1.15 | 0.84 | 0.89 | 1.02 | StationA | RiverA | 50 | 60 |
| 2113 | 22/11/2016 | 0.03 | 0.1 | 0.24 | 0.21 | 0.18 | 0.19 | StationB | RiverB | 55 | 95 |
注
SUBSTR(code_mesure,1,4) = code_stas
可以多次使用相同的日期。我们应该使用order by date_val desc
并使用第一个
正如您在code_mesure 563484
所看到的那样,有两次相同的行。这是一个可能的情况。将使用最新的(如上所示)。
我尝试了以下查询
SELECT *
FROM ( SELECT code_mesure ,
date_val ,
m_05 ,
m_10 ,
m_15 ,
m_20 ,
m_25 ,
m_30 ,
RANK() OVER ( PARTITION BY code_mesure ORDER BY date_val DESC ) AS rnk
FROM VAL_MINUTES
) x
INNER JOIN N_STATION st ON SUBSTR(x.code_mesure, 1, 4) = st.CODE_STAS
WHERE x.rnk = 1
但是我得到同一站的倍数,因为一个站有一个不同的code_mesure列表
|CODE_STAS |CODE_MESURE |
|----------|---------------------|
| 1021|102148, 102159,102132|
如何获得上述预期结果?
答案 0 :(得分:1)
将组合值(5634 | 84)存储在单个字段中是个坏主意。你应该有两个单独的列。
无论如何,您希望对表val_minutes
中的数据进行排名。可以有联系,你想要选择一个记录。因此,使用ROW_NUMBER
(而非RANK
或DENSE_RANK
)为分区中的每条记录(即code_stas
内)提供一个数字:
select
m.m_05, m.m_10, m.m_15, m.m_20, m.m_25, m.m_30,
s.nom_station, s.riviere_bassin, s.lambert_x, s.lambert_y
from n_station s
join
(
select
substr(code_mesure,1,4) as code_stas,
vm.*,
row_number() over (partition by substr(code_mesure,1,4) order by date_val desc) as rnk
from val_minutes vm
) m on m.code_stas = s.code_stas and m.rnk = 1;
答案 1 :(得分:0)
尝试row_number()
而非排名
SELECT *
FROM (
SELECT code_mesure,date_val,m_05,m_10,m_15,m_20,m_25,m_30,
row_number() over (partition by code_mesure order by date_val desc) as row_num
FROM VAL_MINUTES) x
INNER JOIN N_STATION st
ON SUBSTR(x.code_mesure,1,4) = st.CODE_STAS
WHERE x.row_num= 1