Sql 艺术日期。我想把一些问题简化到能够提出一个合理的问题是相当困难的。我猜您已经更改了一些内容,因为USER甚至不是有效的列名,因为它是一个保留字。您好。我认为你的是对的。实际上,srinu的选项非常快,但我没有时间根据自己的需要正确地实现它。还有,这里有更多
Sql 艺术日期。我想把一些问题简化到能够提出一个合理的问题是相当困难的。我猜您已经更改了一些内容,因为USER甚至不是有效的列名,因为它是一个保留字。您好。我认为你的是对的。实际上,srinu的选项非常快,但我没有时间根据自己的需要正确地实现它。还有,这里有更多,sql,performance,oracle,Sql,Performance,Oracle,艺术日期。我想把一些问题简化到能够提出一个合理的问题是相当困难的。我猜您已经更改了一些内容,因为USER甚至不是有效的列名,因为它是一个保留字。您好。我认为你的是对的。实际上,srinu的选项非常快,但我没有时间根据自己的需要正确地实现它。还有,这里有更多的人发布与你相同的答案,但你有更好的解释。谢谢@菲利波-刚刚看了一下斯里努的答案。我们的两个答案应该给出大致相同的结果,并且在性能方面应该相似。densite_-RANKadROW_-NUMBER之间的区别在于,行号将是严格唯一的。例如,如果给
艺术日期。我想把一些问题简化到能够提出一个合理的问题是相当困难的。我猜您已经更改了一些内容,因为
USER
甚至不是有效的列名,因为它是一个保留字。您好。我认为你的是对的。实际上,srinu的选项非常快,但我没有时间根据自己的需要正确地实现它。还有,这里有更多的人发布与你相同的答案,但你有更好的解释。谢谢@菲利波-刚刚看了一下斯里努的答案。我们的两个答案应该给出大致相同的结果,并且在性能方面应该相似。densite_-RANK
adROW_-NUMBER
之间的区别在于,行号将是严格唯一的。例如,如果给定用户的两行具有相同的结束日期(我猜您不应该这样做),则ROW\u NUMBER
将对这些1和2进行编号(可能是不确定的),但densite\u RANK
将对它们进行编号,并返回两个。我认为,首先为空
是必要的,因为它会从当前计划中产生。。这确实很快,但让我研究了稠密的东西。你介意再详细说明一下你在这里做了什么吗?(很抱歉这么生疏!)谢谢在ORDER BY
子句中添加NULLS FIRST
,可能会让它更清晰。不应该sequen
严格地<2?@APC,太糟糕了,小伙子。请注意,我在谷歌上搜索。不明白为什么在简短的回答中询问细节会得到如此粗鲁的反馈。谢谢。这和米凯比克里基说的差不多。他只是得到了一个更长的解释。
USER | PLAN | START_DATE | END_DATE
1 | A | 20110101 | NULL
1 | B | 20100101 | 20101231
2 | A | 20100101 | 20100505
select plan
from (
select plan
from YourTable
where User = 1
order by
case when end_date is null then '99991231' else end_date end desc
)
where rownum < 2
SELECT User, Plan, start_Date, MAX(End_Date) FROM Plans WHERE User NOT IN
(SELECT User FROM Plans WHERE End_Date IS NULL)
GROUP BY Start_Date, Plan, User
UNION
SELECT User,Plan,Start_Date FROM Plans WHERE End_Date IS NULL
SELECT U.user
,(SELECT Plan FROM t WHERE t.user=u.user AND end_date IS NULL LIMIT 1) AS Current_Plan
,(SELECT Plan FROM t WHERE t.user=u.user AND end_date IS NOT NULL ORDER BY end_date DESC LIMIT 1) AS Last_Plan
FROM
( SELECT DISTINCT USER FROM t ) AS U
select PLAN
from USER_TABLE
where END_DATE is null or END_DATE = (
select max(END_DATE)
from USER_TABLE
where USER = 1 and END_DATE is not null)
and USER = 1
select user, plan, start_date, end_date
from (
select
user,
plan,
start_date,
end_date,
row_number() over (partition by user order start_date desc) as row_num_1,
row_number() over (partition by user order end_date desc nulls first) as row_num_2
from user_table
where user = :userid
)
where row_num_1 = 1
select user, plan, start_date, end_date
from (
select
user,
plan,
start_date,
end_date,
from user_table
where user = :userid
order by start_date desc
)
where rownum = 1
SELECT user,plan,end_date,start_date
FROM ( SELECT users,plans,end_date,start_date, DENSE_RANK() OVER ( PARTITION BY user
ORDER BY end_date DESC) sequen
FROM table_name
)
WHERE sequen <= 2
CREATE TABLE XY
( USERID INTEGER NOT NULL
, PLAN VARCHAR2(8) NOT NULL
, START_DATE DATE NOT NULL
, END_DATE DATE )
TABLESPACE USERS;
INSERT INTO XY ( USERID, PLAN, START_DATE, END_DATE )
VALUES ( 1, 'A', To_Date('22-05-2011 00:00:00', 'DD-MM-YYYY HH24:MI:SS'), To_Date('22-05-2011 00:00:00', 'DD-MM-YYYY HH24:MI:SS') );
INSERT INTO XY ( USERID, PLAN, START_DATE, END_DATE )
VALUES ( 1, 'B', To_Date('01-04-2011 00:00:00', 'DD-MM-YYYY HH24:MI:SS'), NULL );
INSERT INTO XY ( USERID, PLAN, START_DATE, END_DATE )
VALUES ( 2, 'A', To_Date('03-05-2011 00:00:00', 'DD-MM-YYYY HH24:MI:SS'), To_Date('04-05-2011 00:00:00', 'DD-MM-YYYY HH24:MI:SS') );
INSERT INTO XY ( USERID, PLAN, START_DATE, END_DATE )
VALUES ( 2, 'B', To_Date('15-05-2011 00:00:00', 'DD-MM-YYYY HH24:MI:SS'), To_Date('20-05-2011 00:00:00', 'DD-MM-YYYY HH24:MI:SS') );
COMMIT WORK;
SELECT USERID, PLAN, END_DATE, START_DATE
FROM (SELECT USERID,
PLAN,
END_DATE,
START_DATE,
ROW_NUMBER() OVER(PARTITION BY USERID ORDER BY END_DATE DESC) SEQUEN
FROM XY)
WHERE SEQUEN < 2
with t as
(select 1 as col_id, 1 as USER_id, 'A' as PLAN , 20110101 as START_DATE, NULL as END_DATE from dual union all
select 2,1,'B', 20100101,20101231 from dual union all
select 3,2,'A', 20100102,20100505 from dual union all
select 4,2,'C', 20100101,20100102 from dual)
--
SELECT user_id, plan
FROM (SELECT user_id,
plan,
MAX(nvl(END_DATE, 99999999)) over(PARTITION BY user_id) max_date,
nvl(END_DATE, 99999999) END_DATE
FROM t)
WHERE max_date = end_date