使用ORDER BY并获取最新版本的记录

时间:2014-02-18 20:03:27

标签: sql oracle sql-order-by

我有一个以下列方式构建的数据库

ID | DATE | col_0        |
--------------------------
1  | 2014 | A_Ver2_data0 |
2  | 2014 | A_Ver2_data1 |
3  | 2014 | A_Ver2_data2 |
4  | 2013 | A_Ver1_data0 |
5  | 2013 | A_Ver1_data1 |
6  | 2012 | A_Ver0_data0 |
7  | 2012 | A_Ver0_data1 |
8  | 2013 | B_Ver3_data0 |
9  | 2013 | B_Ver3_data1 |
10 | 2013 | B_Ver3_data2 |
11 | 2010 | B_Ver2_data0 |
12 | 2010 | B_Ver2_data1 |
13 | 2009 | B_Ver1_data0 |
14 | 2007 | B_Ver0_data0 |

我需要编写一个查询,它将返回最新版本的A_和B_前缀数据集。所以我在想SELECT * FROM db.table ORDER BY DATE DESC之类的东西但是我想过滤掉过期的版本。期望的输出应该是:

ID | DATE | col_0        |
--------------------------
1  | 2014 | A_Ver2_data0 |
2  | 2014 | A_Ver2_data1 |
3  | 2014 | A_Ver2_data2 |    
8  | 2013 | B_Ver3_data0 |
9  | 2013 | B_Ver3_data1 |
10 | 2013 | B_Ver3_data2 |

任何想法?

4 个答案:

答案 0 :(得分:1)

我认为这可以满足您的需求。它解析列以获取第一个和最后一个部分,然后找到每个部分的最大“DATE”。它返回与日期匹配的行:

select id, "DATE", COL_A
from (select v.*,
             max("DATE") over (partition by substr(col_A, 1, 1),
                                            substr(col_A, 8)
                              ) as maxdate
      from versiones v
     ) v
where "DATE" = maxdate;

SQL小提琴是here

答案 1 :(得分:0)

我不确定,但我认为这样可行:“HAVING date> = MAX(date)-1”

max(date)-1将返回2014-1 = 2013,最终将根据日期> = 2013过滤掉结果。

但这会列出所有2013,2014条目。

答案 2 :(得分:0)

您可以使用分析函数获取最大版本,然后选择相应的记录,如下所示:

SELECT
  *
FROM
  db.table
WHERE
  Col_0 IN
  (
    Select Distinct
      Max(Col_0) Over (Partition By Replace(Col_0, Replace(Regexp_Substr(Col_0, '_[^,]+_'), '_', ''), '') 
                       Order By REPLACE(Regexp_Substr(Col_0, '_[^,]+_'), '_', '') DESC) AS Col_0
    FROM
      db.table
  );

此外,请注意您将无法将列命名为DATE,因为DATE是保留字。

答案 3 :(得分:0)

以下是我的回答:

select * from
versiones
where SUBSTR(COL_A,0,6)
in(
  select version from
  (
  select SUBSTR(COL_A,0,1) letra,max(SUBSTR(COL_A,6,1)) maximo,
  SUBSTR(COL_A,0,1)||'_Ver'||max(SUBSTR(COL_A,6,1)) version
  from versiones
   group by SUBSTR(COL_A,0,1)
  )
  cs
  )

Sqlfiddle:http://sqlfiddle.com/#!4/84a8f/13