2014-02-25 45 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;