2016-11-23 60 views
2

給出如下所示的兩個表,我需要檢索每個站,從VAL_MINUTES表的最新值ORACLE - 加入定義表數據表

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 | 

RESULT EX PECTED

| 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有相同的行2次。這是一個可能的情況。最新的(如上所示)將被使用。


我嘗試下面的查詢

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

嘗試通過SUBSTR使用'分區(x.code_mesure,1,4),而不是'在排名功能,應該做的訣竅 –

+0

@EmilHolub我仍然有多個相同的站 – Weedoze

+0

然後最近的日期不是唯一的 - 你需要指定在這種情況下你的查詢做什麼 - 要麼添加另一列您的訂購或其他條件 –

回答

1

這是一個壞主意來存儲合成值|在單場(5634 84)。您應該有兩個單獨的列。

無論如何,你想排名表val_minutes中的數據。可以有關係,但你想選擇一條記錄。因此,使用ROW_NUMBER(而不是RANKDENSE_RANK)給每個記錄在一個分區(內code_stas IE)的數字:

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; 
+0

實際上'date_val'包含日期+小時,然後將沒有重複 – Weedoze

+0

我可以做些什麼來加入另一個具有'code_mesure'和'group'的表?我需要來自特定組的電臺 – Weedoze

+0

呃,'在t.code_mesure = m.code_mesure和t.specificgroup = 123'上加入another_table t? –

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 
+0

同樣的問題,我有'code_mesure'多次同一個站點# – Weedoze