我有不同日期的会员注册信息表。我需要一个查询来查找会员信息。
给定日期,它将检查用户是否在该日期注册
如果是,则返回该日期
如果没有,则返回最新的注册行。
结果中有一个额外的状态列,显示成员是否已注册或截至今天。我正在使用CASE语句计算它。
这是我到目前为止为每个成员显示最新信息的查询。我需要帮助修改/合作,以便它也能恢复我的真实条件。
select *
from (
select id, member_id, enroll_date, end_date,
CASE
WHEN sysdate between enroll_date and end_date THEN 'Active'
ELSE 'Inactive'
END
Status,
row_number() over (partition by member_id order by enroll_date desc) rn
from myView
)where rn = 1
表格结构
ID MEMBER_ID ENROLL_DATE END_DATE
01 123456789 01-JAN-13 31-DEC-13
02 123456789 01-JAN-06 31-DEC-06
03 123456789 01-JAN-11 31-DEC-11
04 987654321 01-JAN-08 31-DEC-12
05 987654321 01-FEB-13 31-DEC-99
06 987654321 01-JAN-13 31-JAN-13
我想根据输入日期获取会员的信息和状态。
例如
a)如果输入日期是2005/1/1那么它应该给我01和05
01 123456789 01-JAN-13 31-DEC-13 Inactive
05 987654321 01-FEB-13 31-DEC-99 Active
b)如果输入是2006/1/1那么它应该给我02和05
02 123456789 01-JAN-06 31-DEC-06 Inactive
05 987654321 01-FEB-13 31-DEC-99 Active
c)如果输入是2013/1/1那么它应该给我01和06
01 123456789 01-JAN-13 31-DEC-13 Inactive
06 987654321 01-JAN-13 31-JAN-13 Inactive
d)如果输入是2014/1/1那么它应该给我01和05
01 123456789 01-JAN-13 31-DEC-13 Inactive
05 987654321 01-FEB-13 31-DEC-99 Active
答案 0 :(得分:1)
select *
from (
select id, member_id, enroll_date, end_date,
CASE
WHEN sysdate between enroll_date and end_date THEN 'Active'
ELSE 'Inactive'
END
Status,
row_number() over (partition by member_id
order by case when :input_date between enroll_date and end_date
then 1 else 2 end, enroll_date desc) rn
from myView
)where rn = 1
这是一个棘手的顺序,它允许您为适合给定日期的行分配rn = 1。否则,具有最大注册日期的行被指定为rn = 1
order by case when :input_date between enroll_date and end_date
then 1 else 2 end, enroll_date desc