2014-02-25 42 views
0

我有下面表下面的列比較數據 -SQL - 從同一個表

ID-1,ID-2和ID-3 - 鍵列

率 - 顯示一個產品的速率基於上述ID

日期 - 暗示該費率適用的日期。

 
+-------+----------+-------------+----------+------------+ 
| ID-1 | ID-2  | ID-3  | Rate  | Date  | 
+-------+----------+-------------+----------+------------+ 
| 2000 | 1  | 100   | 50  | 12/30/2013 | 
+-------+----------+-------------+----------+------------+ 
| 2000 | 1  | 100   | 75  | 10/11/2013 | 
+-------+----------+-------------+----------+------------+ 
| 2000 | 1  | 100   | 100  | 12/15/2013 | 
+-------+----------+-------------+----------+------------+ 
| 2000 | 2  | 100   | 50  | 10/30/2013 | 
+-------+----------+-------------+----------+------------+ 
| 2000 | 2  | 100   | 75  | 10/11/2013 | 
+-------+----------+-------------+----------+------------+ 
| 2000 | 2  | 100   | 100  | 09/15/2013 | 
+-------+----------+-------------+----------+------------+ 
| 3000 | 2  | 200   | 25  | 1/1/2014 | 
+-------+----------+-------------+----------+------------+ 
| 4000 | 2  | 100   | 100  | 12/1/2013 | 
+-------+----------+-------------+----------+------------+ 
| 4000 | 1  | 200   | 75  | 1/1/2014 | 
+-------+----------+-------------+----------+------------+ 
| 4000 | 2  | 100   | 25  | 11/1/2014 | 
+-------+----------+-------------+----------+------------+ 

對於ID-1,每個組合ID-2和ID-3欲OUPUT以下列格式2分最近最率 - 先前速率 - 是用於第二最近的日期 電流的速率價格 - 是最近的最新日期的價格

 
+-------+----------+-------------+---------------+----------------+ 
| ID-1 | ID-2  | ID-3  | Previous Rate | Current Rate | 
+-------+----------+-------------+---------------+----------------+ 
| 2000 | 1  | 100   | 100   | 50    | 
+-------+----------+-------------+---------------+----------------+ 
| 2000 | 2  | 100   | 75   | 50    | 
+-------+----------+-------------+---------------+----------------+ 
| 3000 | 2  | 200   |    | 25    | 
+-------+----------+-------------+---------------+----------------+ 
| 4000 | 1  | 200   |    | 75    | 
+-------+----------+-------------+---------------+----------------+ 
| 4000 | 2  | 200   | 25   | 100   | 
+-------+----------+-------------+---------------+----------------+ 

任何想法?

回答

1

SQL Fiddle

的Oracle 11g R2架構設置

CREATE TABLE test ("ID-1", "ID-2", "ID-3", Rate, "Date") AS 
      SELECT 2000 , 1  , 100   , 50  , TO_DATE('12/30/2013', 'MM/DD/YYYY') FROM DUAL 
UNION ALL SELECT 2000 , 1  , 100   , 75  , TO_DATE('10/11/2013', 'MM/DD/YYYY') FROM DUAL 
UNION ALL SELECT 2000 , 1  , 100   , 100  , TO_DATE('12/15/2013', 'MM/DD/YYYY') FROM DUAL 
UNION ALL SELECT 2000 , 2  , 100   , 50  , TO_DATE('10/30/2013', 'MM/DD/YYYY') FROM DUAL 
UNION ALL SELECT 2000 , 2  , 100   , 75  , TO_DATE('10/11/2013', 'MM/DD/YYYY') FROM DUAL 
UNION ALL SELECT 2000 , 2  , 100   , 100  , TO_DATE('09/15/2013', 'MM/DD/YYYY') FROM DUAL 
UNION ALL SELECT 3000 , 2  , 200   , 25  , TO_DATE('1/1/2014', 'MM/DD/YYYY') FROM DUAL 
UNION ALL SELECT 4000 , 2  , 100   , 100  , TO_DATE('12/1/2013', 'MM/DD/YYYY') FROM DUAL 
UNION ALL SELECT 4000 , 1  , 200   , 75  , TO_DATE('1/1/2014', 'MM/DD/YYYY') FROM DUAL 
UNION ALL SELECT 4000 , 2  , 100   , 25  , TO_DATE('11/1/2014', 'MM/DD/YYYY') FROM DUAL; 

查詢1

WITH rankings AS (
    SELECT "ID-1", 
     "ID-2", 
     "ID-3", 
     Rate, 
     DENSE_RANK() OVER (PARTITION BY "ID-1", "ID-2", "ID-3" 
          ORDER BY "Date" DESC, Rate DESC) AS "Rank" 
    FROM test 
) 
SELECT "ID-1", 
     "ID-2", 
     "ID-3", 
     MAX(CASE "Rank" WHEN 1 THEN Rate END) AS current_rate, 
     MAX(CASE "Rank" WHEN 2 THEN Rate END) AS previous_rate 
FROM rankings 
GROUP BY 
     "ID-1", 
     "ID-2", 
     "ID-3" 

Results

| ID-1 | ID-2 | ID-3 | CURRENT_RATE | PREVIOUS_RATE | 
|------|------|------|--------------|---------------| 
| 2000 | 1 | 100 |   50 |   100 | 
| 2000 | 2 | 100 |   50 |   75 | 
| 3000 | 2 | 200 |   25 |  (null) | 
| 4000 | 1 | 200 |   75 |  (null) | 
| 4000 | 2 | 100 |   25 |   100 | 
+0

MT0 - 爲什麼我們在select中做了max()? – jagamot

+1

「排名」子查詢將根據降序日期排序順序爲「ID-1」,「ID-2」和「ID-3」分區中的每一行分配奧運排名;但是,這不會將分區中的行分組。爲了確保返回單個值,您需要對這些行進行分組,這需要一個聚合函數 - 即「MAX」);由於前面的行排序來分配排名,那麼'MIN'或'AVG'的效果會一樣好,但我隨意選擇了'MAX'。 – MT0

2

也許這樣?

select 
    id-1, 
    id-2, 
    id-3, 
    first_value(rate) over (partition by id-1, id-2, id-3 order by date desc) as current_rate 
    lead(rate,1) over (partition by id-1, id-2, id-3 order by date desc) as prev_rate 
from 
    table 
+0

上面的查詢正在帶回重複的行,但是有關日期的所有可用行中的正確的當前值和先前值。 Lead函數只是將當前行的數據與下一行的數據進行比較並返回數據。觀察到對於ID-1 = 2000,我總共有6行,但輸出只包含2行 – jagamot

0

這可能對你有所幫助。

SELECT id1, id2, id3, prev_rate, curr_rate 
FROM(
    SELECT id1, 
      id2, 
      id3, 
      rate AS curr_rate, 
      LEAD(rate,1) OVER (PARTITION BY id1, id2, id3 ORDER BY date DESC) AS prev_rate, 
      DENSE_RANK() OVER (PARTITION BY id1, id2, id3 ORDER BY date DESC) AS rnk 
    FROM <table_name> 
    ) 
WHERE rnk = 1;