【问题标题】:SQL Max() for corresponding none null valuesSQL Max() 对应的无空值
【发布时间】:2021-09-02 09:52:58
【问题描述】:

我有下表,我需要返回 colA 不为空的最高 colC 数。这种情况将是 |否 | ID1234 | 10. 文字。|

最初我使用 strtok(c​​olC,'.',1)*1 从 colC 中提取数字,但现在我被困在如何返回 MAX 上。非常感谢任何帮助。

colA colB colC
Yes ID1234 1. text
No ID1234 2. text
ID1234 3. text
No ID1234 4. text
Yes ID1234 5. text
Yes ID1234 6. text
ID1234 7. text
ID1234 8. text
ID1234 9. text
No ID1234 10. text
ID1234 11. text
ID1234 12. text

【问题讨论】:

  • 我有点困惑。是解析colC 中的字符串的问题吗?
  • 如果 colc 是文本列,则最大值为 '9。 text',因为 '9' 晚于 '10' 的前导 '1'。 text' 在有序列表中。因此,也许您对如何存储数据有疑问。如果您想要 10 > 9,则将该数字与文本分开存储。
  • 发布您到目前为止所尝试的内容。这应该不会太难。

标签: sql teradata


【解决方案1】:

为什么不这样?

select max(colC)
from table
where colA is not null

【讨论】:

    【解决方案2】:

    你可以使用qualify——假设colC确实可以使用字符串排序:

    select t.*
    from t
    where colA is not null
    qualify row_number() over (order by colC desc) = 1;
    

    不过,尚不清楚问题是否只是订购 colC 还是正在解析 colC 的初始编号。如果是后者,你可能想要这样的东西:

    qualify row_number() over (order by length(regexp_substr(colC, '^[^ ]+')) desc, colC desc) = 1;
    

    【讨论】:

    • 谢谢你,这让我找到了正确的方向,我能够用一个 ID 获得表格的结果。但是,我需要在具有多个 ID 的表上运行它。因此,我希望 colA 不为空的每个 ID 的 cast(strtok(c​​olC,'.',1) as int) 的最大值。
    • @user2865268 。 . .只需将partition by id 添加到窗框规范中即可。
    【解决方案3】:

    假设你有这样的东西来解析 ColC 以获得数字部分:

    cast(strtok(colc,'.',1) as integer) as der_col
    

    您可以在该派生列上使用限定符:

        select
        ...
     cast(strtok(colc,'.',1) as integer) as der_col,
    ...
        from
        yourtable
        ...
        qualify row_number() over (order by der_col ASC) = 1
    

    【讨论】:

      猜你喜欢
      • 2011-10-12
      • 1970-01-01
      • 2018-02-16
      • 1970-01-01
      • 1970-01-01
      • 2012-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多