ORACLE - 使用数据表连接定义表

时间:2016-11-23 12:06:16

标签: sql oracle

鉴于下面显示的两个表,我需要为每个站检索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|

如何获得上述预期结果?

2 个答案:

答案 0 :(得分:1)

将组合值(5634 | 84)存储在单个字段中是个坏主意。你应该有两个单独的列。

无论如何,您希望对表val_minutes中的数据进行排名。可以有联系,你想要选择一个记录。因此,使用ROW_NUMBER(而非RANKDENSE_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