求助, 帮忙写一条query

[复制链接]
查看11 | 回复6 | 2010-3-1 11:04:59 | 显示全部楼层 |阅读模式
本帖最后由 KEN6503 于 2013-3-19 07:06 编辑
要求:以ID分组, 当dt1 小于 最大的 dt2 (记录中的IND =1)时, 如果在同一组中有dt1=dt2的记录, 就找出这一条。如果没有dt1=dt2的记录, 找出最小的dt2 满足dt1<dt2和最大的dt2 满足dt1>dt2。
create table sdl.test (pk1 int, id int, dt1 int, dt2 int, ind int);
insert into test values(1,1,5, 3, 1);
insert into test values (2,1,5, 2, 0);
insert into test values (3,2,4, 6, 1);
insert into test values (4,2,4, 5, 0);
insert into test values (5,3,4, 7, 1);
insert into test values (6,3,4, 6, 0);
insert into test values (7,3,4, 3, 0);
insert into test values (8,3,4, 2, 0);
insert into test values (9,4,3, 7, 1);
insert into test values (10,4,3, 6, 0);
insert into test values (11,4,3, 3, 0);
insert into test values (12,4,3, 2, 0);
select * from test
pk1iddt1dt2ind
11531
21520
32461
42450
53471
63460
73430
83420
94371
104360
114330
124320
pk1iddt1dt2ind
42450
63460
73430
114330

谢谢各位高手





回复

使用道具 举报

千问 | 2010-3-1 11:04:59 | 显示全部楼层
以ID分组, 当dt1 小于 最大的 dt2 (记录中的IND =1)时复制代码有两点没理解
1.dt1是小于该组中最大的dt2?
2.ind=1也是限制条件,也就是dt1小于dt2并且ind=1时?
回复

使用道具 举报

千问 | 2010-3-1 11:04:59 | 显示全部楼层
pk1=7的记录怎么出来的?也不满足条件啊
回复

使用道具 举报

千问 | 2010-3-1 11:04:59 | 显示全部楼层
本帖最后由 KEN6503 于 2013-3-19 09:09 编辑
hudingchen 发表于 2013-3-19 08:58
有两点没理解
1.dt1是小于该组中最大的dt2?
2.ind=1也是限制条件,也就是dt1小于dt2并且ind=1时?

1。 是的, dt1 小于 该组中最大的dt2。
2。 ind=1时, dt2是该组中最大. 意思是当前的记录, 其他(ind=0)都是过期的。
回复

使用道具 举报

千问 | 2010-3-1 11:04:59 | 显示全部楼层
select pk1, id, dt1, dt2, ind
from (
select pk1, id, dt1, dt2, ind, row_number() over(partition by id, flag order by gap) rn
from (
select pk1, id, dt1, dt2, ind, case when has_equal = 1 and gap != 0 then 'N' else 'Y' end include, flag, gap
from (

select pk1, id, dt1, dt2, ind, (select count(*) from t t_in where t_in.id = t.id and sign(t_in.dt1 - t_in.dt2) = 0) has_equal, sign(dt1 - dt2) flag, abs(dt1 - dt2) gap

from t
)
)
where include = 'Y'
)
where rn = 1
and ind = 0;
关于IND的条件不是很清楚. 但应该可以很容易地加到上面的query里.
回复

使用道具 举报

千问 | 2010-3-1 11:04:59 | 显示全部楼层
hudingchen 发表于 2013-3-19 09:04
pk1=7的记录怎么出来的?也不满足条件啊

同一组中最大的dt2 满足dt1>dt2
回复

使用道具 举报

千问 | 2010-3-1 11:04:59 | 显示全部楼层
本帖最后由 KEN6503 于 2013-3-19 09:33 编辑
nothingbutoracl 发表于 2013-3-19 09:13
select pk1, id, dt1, dt2, ind
from (
select pk1, id, dt1, dt2, ind, row_number() over(partitio ...

谢谢, 这正是我需要的。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行