【问题标题】:Epression with max and multiple condition具有最大和多个条件的表达式
【发布时间】:2019-06-09 15:48:21
【问题描述】:

我有下表。我想要每章一个值。 (我有一个带有 case 表达式的 SQL,但返回不正确,所以我不会显示以避免混淆。)

每章条件:

A - END_DT 不为 NULL 且 ROLE = RED 且 USERID 不为 NULL 则为 USERID 的最后一行值

B - END_DT 为 NULL 且 ROLE = RED THEN LAST ROW VALUE FOR USERID

表P

END_DT      ROLE   PK    USERID  CHAPTER
 01/10/19    RED   101     5       1
 01/10/19    BLUE  102     5       1
 01/10/19    RED   103     7       1
 01/10/19    RED   104             1
             RED   105     8       2
             BLUE  106     9       2
             BLUE  107     5       3

预期结果:

CHAPTER   USERID
 1          7
 2          8

【问题讨论】:

  • 如果角色是 BLUE 怎么办?
  • 这是不完整的。您说,您希望每章有一个值,那么为什么还要说“USERID 的最后一行值”?如果你在谈论“每章条件”,你怎么能谈论某个END_DTROLEUSERID?每章有不同的。请澄清。
  • “最后一行值”对 B 意味着什么?如果没有END_DT,则没有last 行。还是PK 保证上升,你指的是这个?

标签: sql oracle function case rank


【解决方案1】:

试试这个:

select chapter, userID
from
(
  select top 1 chapter, last_value(userID) over(order by userID desc)as rw, userID
  from sample
  where END_DT is NOT NULL AND ROLE = 'RED' 
  union
  select top 1 chapter, last_value(userID) over(order by userID desc)as rw, userID
  from sample
  where END_DT is NULL AND ROLE = 'RED'
) w 

【讨论】:

  • Oracle 中没有TOP 关键字。而没有ORDER BYTOP 1 会任意选择一行。您的查询正在寻找 RED 条目,选择一个带日期和一个不带日期的条目,显示该行的用户和章节以及任何章节的最后一个用户 ID。如果两行恰好显示相同的数据,则使用UNION 删除其中的一行。这似乎有点缺陷。
【解决方案2】:
  1. 您希望每章有一个用户 ID。
  2. 您只能查看角色 = 'RED' 和用户 ID 的记录。
  3. 其中您更喜欢带有日期的行。如果某一章没有包含日期​​的行,则可以使用无日期行。
  4. 在所选行中,您要使用PK 最高的行。

使用 Oracle 的KEEP LAST 进行此排名:

select
  chapter,
  max(userid) keep (dense_rank last order by case when end_dt is null then 1 else 2 end, id)
from mytable
where role = 'RED' and userid is not null
group by chapter
order by chapter;

或者使用ROW_NUMBER,如果你想要一个标准的SQL查询:

select chapter, userid
from
(
  select
    chapter,
    userid,
    row_number() over (partition by chapter 
                       order by case when end_dt is null then 2 else 1 end,
                                id desc) as rn
  from mytable
  where role = 'RED' and userid is not null
)
where rn = 1
order by chapter;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    • 1970-01-01
    • 2018-09-11
    • 1970-01-01
    相关资源
    最近更新 更多