作为我previous question的后续行动,有一个我想探索的替代方案。我的表格布局如下:
T1: ID | Date | Hour | Interval
时间间隔从1
到12
(小时间隔为5分钟),小时从1
到24
,日期/ ID是任意的。当我从外部源提取数据时,有些行的间隔为0
。如果时间间隔为0
,则表示已涵盖整个小时(即从1
到12
的所有时间间隔。)
示例数据:
T1: 1 | 1/1/2011 | 1 | 1
1 | 1/1/2011 | 1 | 4
1 | 1/1/2011 | 1 | 0
1 | 1/1/2011 | 2 | 2
1 | 1/1/2011 | 2 | 5
1 | 1/1/2011 | 3 | 0
请注意,间隔与0
- 标记的间隔重叠。有什么方法可以将0
间隔扩展到一小时的所有12个间隔?所以,我基本上想将示例数据转换为:
T1: 1 | 1/1/2011 | 1 | 1
1 | 1/1/2011 | 1 | 2
1 | 1/1/2011 | 1 | 3
1 | 1/1/2011 | 1 | 4
...
1 | 1/1/2011 | 1 | 11
1 | 1/1/2011 | 1 | 12
1 | 1/1/2011 | 2 | 2
1 | 1/1/2011 | 2 | 5
1 | 1/1/2011 | 3 | 1
1 | 1/1/2011 | 3 | 2
1 | 1/1/2011 | 3 | 3
...
1 | 1/1/2011 | 3 | 11
1 | 1/1/2011 | 3 | 12
使用SQL是否可以这样?
答案 0 :(得分:1)
创建一个表“interval”,其中12行包含单个字段“iinterval”,值为1到12。
iinterval
1
2
3
4
5
6
7
8
9
10
11
12
然后,您可以在间隔表和间隔为零的T1行之间进行交叉连接。 (我将T1字段重命名为Date,Hour和Interval,因为这些都是保留字。)
SELECT T1.ID, T1.idate, T1.ihour, intervals.iinterval
FROM T1, intervals
WHERE T1.iinterval=0;
由于没有指定JOIN条件,因此每个T1行(具有零间隔)将与每个间隔行连接。
ID idate ihour iinterval
1 1/1/2011 1 1
1 1/1/2011 1 2
1 1/1/2011 1 3
1 1/1/2011 1 4
1 1/1/2011 1 5
1 1/1/2011 1 6
1 1/1/2011 1 7
1 1/1/2011 1 8
1 1/1/2011 1 9
1 1/1/2011 1 10
1 1/1/2011 1 11
1 1/1/2011 1 12
如果得到你想要的间隔等于零的行,你可以在UNION查询中使用它来将这些行添加到间隔不零的T1行。
SELECT a.ID, a.idate, a.ihour, a.iinterval
FROM T1 AS a
WHERE a.iinterval<>0
UNION
SELECT T1.ID, T1.idate, T1.ihour, intervals.iinterval
FROM T1, intervals
WHERE T1.iinterval=0;
我希望这能指出一些有用的东西,但怀疑这正是你最终想要的东西。我的预订是因为这个条件:“请注意,间隔和0标记的间隔重叠”。我不知道应对这些重叠会发生什么。