【发布时间】:2016-04-08 14:21:31
【问题描述】:
这是这个问题的后续问题:How do I need to change my sql to get what I want in this case?
我的两张表如下:
Table 1
id id2 date
1 2 2015-01-10
2 5 2015-06-13
3 9 2015-09-05
4 10 2015-02-11
5 26 2015-01-10
6 65 2015-01-25
Table 2
id id2 data(varchar2)
1 2 A
2 5 A
3 9 A
4 10 B
5 26 B
6 65 B
Table 2 中的数据是 varchar2 类型,其中包含N 数字,由, 分隔,其中N 可能依赖于id2。例如,A 可能是这样的:
1.0,1.1,1.2,1.3,1.4,1.5,2.6,2.7,2.8,2.9, ...(ommitted)..., 9.5,9.9
我想编写一个查询,返回 Table 2 中唯一的 data,它在 Table 1 中具有最大日期,对于上表来说如下:
id2 date number
2 2015-01-10 1.0
2 2015-01-10 1.1
2 2015-01-10 1.2
2 2015-01-10 1.3
...
2 2015-01-10 9.5
2 2015-01-10 9.9
10 2015-02-11 ***
10 2015-02-11 ***
...
10 2015-02-11 ***
每个唯一的id2 在查询输出中出现N 次。
根据 Fuzzy 的回答,我可以得到唯一的 id2s,如下所示:
select * from (
select
t2.id2, t1.date, t2.data,
row_number() over (partition by t2.data order by t1.date desc) rn
from table1 t1
join table2 t2 on t1.id2 = t2.id2
) t where rn = 1;
但我不知道如何从那里继续。非常感谢。
【问题讨论】:
-
80是固定值还是可以逐行变化?
-
@Aleksej 我已更新问题描述以使其更清晰。
-
问题是这种可怕的桌子设计。没关系,只要
data只包含一些字符串给你。但这种情况并非如此;您对存储在data中的子字符串感兴趣。但是,如果您对单独的数据感兴趣,请单独存储!不要编写查询来解决这个混乱;更改您的数据库。 -
我第二个@ThorstenKettner。您的数据列违反了数据库规范化的[原子性原则](en.wikipedia.org/wiki/First_normal_form#Atomicity)。与其编写一个聪明的查询,您的解决方案实际上应该是从您的
data列中提取所有单独的值,并将它们作为单独的行存储在不同的表中。 -
@ThorstenKettner 和 DanK 尽管我对数据库设计还很陌生,但我同意你们俩的观点。但我不负责设计表格。实际上,我什至无法要求他们对当前的设计进行任何更改。我被赋予了这项任务并且正在努力完成它:-(再次感谢你们。