首页 > 解决方案 > 根据一组标准选择要显示的行

问题描述

我正在继续开发一个给我带来很多麻烦的项目。首先,我不知道如何使用 Entity Framework,但我知道数据库设计,并且查看这个数据库让我很头疼,因为它没有标准化。我不确定这是 Entity Framework 还是以前的开发人员的错。

假设我有这张桌子:

ForeignKey    Product     Manufacturing     Completed
--            -------     -------------     ---------
01            Shoes       Step A            2020-02-24 00:00:00.0000000
02            Shirt       Step A            2020-02-25 00:00:00.0000000
03            Pants       Step A            2020-02-25 00:00:00.0000000
01            Shoes       Step B            2020-02-24 13:56:00.0000000
02            Shirt       Step B            NULL
03            Pants       Step B            2020-02-25 13:11:00.0000000
04            Hat         Step B            NULL
04            Hat         Step A            NULL

我需要取回以下一组结果:

ForeignKey    Product     Manufacturing     Completed
--            -------     -------------     ---------
01            Shoes       Step B            2020-02-24 13:56:00.0000000
02            Shirt       Step B            NULL
03            Pants       Step B            2020-02-25 13:11:00.0000000
04            Hat         Step A            NULL

我不是 SQL 专家,所以这给我带来了很多麻烦。我需要满足以下条件:

1. 返回制造过程中最远的行。这意味着有时两行的完成日期都将为空(我需要返回步骤 A 的行),有时第一步的完成日期将是完整的,但第二个将是空的(在这种情况下,我需要返回步骤 B,因为它是通过第一步完成的),有时他们都有完成的日期,在这种情况下,我需要返回步骤 B。
2. 选择步骤 A 和步骤 B 是为了清楚这个问题,实际上,步骤 A 的名称按字母顺序出现在步骤 B 之后,因此按字母顺序排序是行不通的。

这让我把头发拉出来。帮助!

标签: c#sqlgreatest-n-per-group

解决方案


这是你想要的吗?

select *
from (
    select
        t.*,
        rank() over(
            partition by foreignkey 
            order by 
                case when completed is null then 0 else 1 end, 
                completed desc, 
                manufacturing
       ) rn
    from mytable t
) t
where rn = 1
order by foreignkey

逻辑位于order by窗口函数的子句中:这会将其放在首位的记录completednull然后按降序completed(如果有)排序,最后按升序排序manufacturing

DB Fiddle 上的演示

外键 | 产品 | 制造业| 家企业 完成| rn
---------: | :-------- | :------------ | :---------------------------- | -:
         1 | 鞋 | 步骤 B | 2020-02-24 13:56:00.0000000 | 1
         2 | 衬衫 | 步骤 B |                         | 1
         3 | 裤子 | 步骤 B | 2020-02-25 13:11:00.0000000 | 1
         4 | 帽子 | 步骤 A |                         | 1

推荐阅读