sql - 使用 nvl 和 max 查找唯一值

标签 sql oracle plsql

我只想选择输入日期在 beg_date 和 end_date 之间的行,但由于有多行可以为 true,所以如果有多行,我想选择最大 end_date。通过以下信息,即使日期位于第二行的 beg_date 和 end_date 之间,我也希望仅选择第一行。

此外,当我使用 ma​​x 函数时,我最终可能会选择空值,并且不会返回 grp_id,因为 end_date 为空。我可能必须在某个地方使用 nvl 函数,但不确定在哪里。

客户编号:20080909

日期:95 年 6 月 25 日

Customer_Nbr Grp_Id  Beg_Date   End_Date
12345689     9       21-MAY-95  24-FEB-97
12345689     9       21-MAY-95  24-FEB-96
12345689     9       27-JUN-04  null

到目前为止,这可以获取非空的 end_date 值。

SELECT grp_id
  FROM table1 
  WHERE customer_nbr = '12345689'
  AND to_date('06/27/2004','MM/DD/YYYY')
  BETWEEN beg_date AND nvl(end_date,to_date('12/31/9999','MM/DD/YYYY'));

最佳答案

SELECT grp_id
  FROM (SELECT grp_id, MAX(end_date) over(PARTITION BY 1) AS max_end_date,
                end_date
           FROM table1
          WHERE customer_nbr = '12345689'
            AND to_date('06/27/2004', 'MM/DD/YYYY') BETWEEN beg_date AND
                nvl(end_date, to_date('06/27/2004', 'MM/DD/YYYY')))
 WHERE end_date = max_end_date

你需要知道选择的每一行的 max_end ,如果你使用分析函数 over(partition..) ,你有 max() 函数在上面的行上具有相同的结果,然后只通过 end_date = max_end_date 进行过滤

(并且输入日期 06/27/2004 必须与 nvl 函数中的相同)

关于sql - 使用 nvl 和 max 查找唯一值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36180849/

相关文章:

sql - oracle sql developer tool - 提交后数据不可用

mysql - 在 MySQL 中使用 CASE/WHEN 的奇怪行为

java - 使用 sysdate 更新日期列会引发 Oracle 中的唯一约束冲突。由于日期是主键而随机发生

sql - 如何同时运行两个慢速 SQL SELECT 语句

oracle - PL/SQL中如何查看变量的类型?

mysql - 如何编写一个接一个地更新两个表的触发器

mysql - 验证(子)表中值的存在并返回 "boolean"结果

sql-server - 无法添加 Oracle OLEDB 提供程序的性能计数器

oracle - 如何在 Oracle 数据库中将列的数据类型从 varchar2 更改为数字

c# - 在oracle中使用 "nested"事务