我有一个以下列方式构建的数据库
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 |
任何想法?
答案 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