【问题标题】:Getting values based on other column根据其他列获取值
【发布时间】:2021-09-27 19:29:50
【问题描述】:

我在 SQL 中有以下数据。

NAME,DATE,REF


Pat1,2021-07-15,5072

'',NULL,5072

'',NULL,5072

'',NULL,5072

'',NULL,5072

Pat2,2021-07-15,5073

有没有一种方法可以使用 SELECT QUERY 来根据 REF 值替换 DATE 列中的 NULL 值?

比如用匹配 REF 值的第一个可用日期替换 NULL 值,而不对数据库进行任何更改。

预期结果

NAME,DATE,REF




Pat1,2021-07-15,5072

'',2021-07-15,5072

'',2021-07-15,5072

'',2021-07-15,5072

'',2021-07-15,5072

Pat2,2021-07-15,5073

【问题讨论】:

  • “ref”可以有不同的日期吗?'
  • 'REF' 在这种情况下不会有不同的日期。
  • 您使用的是哪个 dbms?
  • Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64) Sep 24 2019 13:48:23 版权所有 (C) 2019 Microsoft Corporation Express Edition (64-bit) o​​n Windows 10 Enterprise 10.0 (内部版本 18363:)

标签: sql sql-server select window-functions sql-null


【解决方案1】:

你可以用MAX()窗口函数来做到这一点:

SELECT NAME,
       COALESCE(DATE, MAX(DATE) OVER (PARTITION BY REF)) DATE,
       REF
FROM tablename 

请参阅demo

【讨论】:

  • 如果 REF 是别名列怎么办?
  • @ManishKumar 那么你应该在 PARTITION BY 子句中使用原始列而不是 REF。
  • 对于 REF "COALESCE(TABLE1.REF,TABLE2.REF,TABLE3.REF,TABLE4.REF) AS REF" 是这样的
  • @ManishKumar PARTITION BY COALESCE(TABLE1.REF,TABLE2.REF,TABLE3.REF,TABLE4.REF)
【解决方案2】:

有一个派生表(子查询)来返回每个参考的日期。 JOIN:

select t1.NAME, t2.date, t1.REF
from tablename t1
join (select ref, max(date) date
      from tablename
      group by ref) t2
  on t1.ref = t2.ref

【讨论】:

  • 可以用 CASE WHEN 或 ISNULL 来完成吗?
  • 我猜是这样,但这更好。
  • 我已经有多个连接来获得这个结果。不用Join可以试试吗?
  • 看看@forpas 的回答!
猜你喜欢
  • 1970-01-01
  • 2016-11-30
  • 1970-01-01
  • 2016-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-25
相关资源
最近更新 更多