【问题标题】:SQL View Select OptionalSQL 视图 选择 可选
【发布时间】:2020-07-08 18:09:09
【问题描述】:

我认为当前的输出是这样的

   Code Value GrpCode GrpDft
  --------------------------
   A,   1,    A1,     N
   B,   null, A1,     Y
   C,   1,    A2,     N
   D,   2,    A2,     Y
   E,   null, A3,     Y
   F,   null, A3,     N       

规则如下

  1. 每个组只能有 2 个代码,并且总是有一个默认代码而不是一个默认代码。
  2. 如果默认代码不为空,则始终显示该行。不管非默认代码是否有价值
  3. 如果默认代码为空,则仅当它有值时才显示无默认代码值。
  4. 如果默认和非默认代码都为空,则显示默认值。

所以基于上面我应该有下面的行剩余。

   A, 1,    A1, N
   D, 2,    A2, Y
   E, null, A3, Y

不幸的是,由于其他因素,这必须作为视图而不是存储过程或函数来完成。

【问题讨论】:

  • 您的问题是指所谓的“默认代码”。我在示例数据中看不到该名称的任何内容。
  • 您提出了一些要求,但遗漏了一个问题。请阅读this,了解一些改进“问题”的技巧。

标签: sql sql-server tsql greatest-n-per-group hana


【解决方案1】:

如果我没听错的话,你可以用窗口函数来实现这个逻辑:

select * 
from (
    select 
        t.*,
        row_number() over(
            partition by grpCode
            order by 
                case
                    when grpDft = 'Y' and value is not null then 0
                    when grpDft = 'N' and value is not null then 1
                    else 2
                end,
                grpDft desc
        ) rn
    from mytable t
) t
where rn = 1

Demo on DB Fiddle

代码 |价值 | GrpCode | GrpDft | rn :--- | ----: | :-------- | :----- | :- 一个 | 1 | A1 | N | 1 D | 2 | A2 |是 | 1 E | | A3 |是 | 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多