代码之家  ›  专栏  ›  技术社区  ›  qed59

SQL查询,如果列值存在,则按其分组,否则列出所有记录

  •  -1
  • qed59  · 技术社区  · 3 周前

    我在SQL数据库中有一些报告。有些报告有报告编号,有些报告没有报告编号。

    报告_id 报告创建者 版本 报告编号
    1. 约翰·史密斯 1. 101
    2. 约翰·史密斯 2. 101
    3. 杰克·约翰逊
    4. Madeline Joe

    我想对有报告编号的报告进行分组,并列出所有没有报告编号的报表。 所以我应该得到这样的结果:

    报告_id 报告创建者 版本 报告编号
    1. 约翰·史密斯 1. 101
    3. 杰克·约翰逊
    4. Madeline Joe

    我应该如何编写SQL查询?

    注意:我已经在使用 UNION 解决这个问题,但我正在寻找更好的解决方案。

    非常感谢。

    2 回复  |  直到 3 周前
        1
  •  3
  •   Thorsten Kettner    3 周前

    注意:我已经在使用UNION来解决这个问题,但正在寻找更好的解决方案。

    UNION 最佳解决方案。

    with
      null_report as
      (
        select report_id, report_created_by, versions, report_number
        from reports
        where report_number is null
      ),
      first_non_null_report as
      (
        select top(1) with ties
          report_id, report_created_by, versions, report_number
        from reports report_number
        where report_number is not null
        order by row_number() over (partition by report_number order by versions)
      )
    select * from null_report
    union all
    select * from first_non_null_report
    order by report_id;
    

    演示: https://dbfiddle.uk/Y5qLaJA5

        2
  •  0
  •   VvdL    3 周前

    排序后可以获得行号 versions report_created_by 使用 row_number() over () ,然后选择第一条记录:

    with lowest_report_versions as (
      select 
        reports.*, 
        row_number() over (partition by report_created_by order by versions) as r
       from reports
    )
    select * 
    from lowest_report_versions 
    where r = 1 
    order by report_id
    

    db<>fiddle