【问题标题】:How to get the Max Date, Min Date and Null is the column is empty using SQL Query如何使用 SQL Query 获取 Max Date、Min Date 和 Null 列是否为空
【发布时间】:2022-01-03 07:13:52
【问题描述】:

我在创建 SQL 查询时遇到了一些麻烦。我想用所有列和行查询表中的记录。

我使用下面的select 查询。它实际上反映了我想要的记录,但唯一的问题是它只显示了 19 列中的 3 列。它只显示BarangayWentoffRestored 的列。我想要的是显示相应结果的所有 19 列。

这是我的 SQL 代码:

SELECT Barangay, MIN(wentoff) as Wentoff, 
CASE WHEN MAX(CASE WHEN Restored IS NULL THEN 1 ELSE 0 END) = 0 THEN MAX(Restored) End 
FROM ReportforValidation 
GROUP BY Barangay

请查看我查询的当前结果:

我需要显示的表格的字段:

【问题讨论】:

  • 请不要将输出或错误消息添加为图像。它们读起来很痛苦。编辑您的问题以将任何其他信息添加为文本。并将您的标题缩小为格式正确的文本。
  • “唯一的问题是它只显示了 3 行”:你希望得到多少行?
  • 我有 19 行。如果可能的话,把它全部展示出来
  • 您混淆了“行”和“列”这两个术语。您可能需要三行的所有列。您使用的 DBMS 是什么?您使用的是 MySQL 还是 SQL Server?甲骨文还是 PostgreSQL?对于 SQL 问题,了解这一点很重要。
  • 你还在说行。你是说行吗?你想要19行吗?不是 3 行 19 列?再说一遍:您希望每个 Barangay 有一个结果行吗?是还是不是?

标签: sql sql-server


【解决方案1】:

你可以使用窗口函数代替group by:

SELECT  Barangay, 
        MIN(wentoff) OVER (
            PARTITION BY Barangay
        ) as Wentoff, 
        FIRST_VALUE(Restored) OVER (
            PARTITION BY Barangay 
            ORDER BY CASE WHEN Restored IS NULL THEN 0 ELSE 1 END, 
                     Restored DESC
        ),
        ReportNo,
        area,
        calamaty,
        response
FROM    ReportforValidation;

将您希望在输出中包含的所有列添加到select 子句。

如果您不想要所有行,而只想要那些具有“第一个值”Restored 的行,那么还要选择分区的行号并将其包装在 select 中过滤第 1 行的查询:

SELECT *
FROM   (
    SELECT  Barangay, 
            MIN(wentoff) OVER (
                PARTITION BY Barangay
            ) as Wentoff, 
            FIRST_VALUE(Restored) OVER (
                PARTITION BY Barangay 
                ORDER BY CASE WHEN Restored IS NULL THEN 0 ELSE 1 END, 
                         Restored DESC
            ) Restored,
            ROW_NUMBER() OVER (
                PARTITION BY Barangay 
                ORDER BY CASE WHEN Restored IS NULL THEN 0 ELSE 1 END, 
                         Restored DESC
            ) as rn,
            ReportNo,
            area,
            calamaty,
            response
    FROM    ReportforValidation
    ) as all_rows
WHERE rn = 1;

【讨论】:

  • 好的先生,我会试试的,这是快速响应非常感谢
  • 先生,我尝试您提供的代码,它实际上显示了整行.. 但问题是结果不正确
  • 您的问题说您想要所有行。我添加了一个只显示 3 行的查询。这就是你想要的吗?
  • 为了避免在这里进行长时间的讨论,您能否帮助我们所有人并编辑您的问题并在您的表格(示例)中提供 数据预期输出 的查询?这将解决任何误解。
  • 您能否编辑您的问题并提供表中的数据(其中的一个示例)以及该数据查询的预期输出?
【解决方案2】:

@trincot 先生,您的代码完美运行我对此代码唯一担心的是 rn 也出现在列中。怎么隐藏?
选择 * 从 ( 选择描笼涯, MIN(wentoff) OVER ( Barangay的分区 ) 作为温托夫, FIRST_VALUE(已恢复)超过( Barangay的分区 ORDER BY CASE WHEN Restored IS NULL THEN 0 ELSE 1 END, 恢复 DESC ) 恢复, ROW_NUMBER() OVER ( Barangay的分区 ORDER BY CASE WHEN Restored IS NULL THEN 0 ELSE 1 END, 恢复 DESC ) 作为 rn, 报告否, 区域, 灾难, 回复 FROM 验证报告 ) 作为 all_rows 其中 rn = 1;

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 1970-01-01
  • 2019-06-25
  • 1970-01-01
  • 2022-07-16
  • 2023-03-12
  • 2020-06-18
  • 2022-08-02
  • 2020-11-01
  • 1970-01-01
相关资源
最近更新 更多