c# - 根据一组标准选择要显示的行
问题描述
我正在继续开发一个给我带来很多麻烦的项目。首先,我不知道如何使用 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 之后,因此按字母顺序排序是行不通的。
这让我把头发拉出来。帮助!
解决方案
这是你想要的吗?
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
窗口函数的子句中:这会将其放在首位的记录completed
,null
然后按降序completed
(如果有)排序,最后按升序排序manufacturing
。
外键 | 产品 | 制造业| 家企业 完成| 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
推荐阅读
- excel - 当我在 P 列中写 x 时删除一行。(VBA)
- python - Jupyter Notebook 崩溃计算机中的 SQLAlchemy SQL 脚本
- excel - Excel 时间轴只影响一个数据透视表
- javascript - 如何触发从 iFrame 到对话框的点击
- javascript - 如何找到具有特定模式的前一个元素
- azure - Azure mysql 连接重定向更改编码
- azure - 使用 az apim api 在 apim 中更新 api
- java - 使用 JPAContainerFactory 创建的 SELECT 查询创建实体管理器创建 INSERT INTO 查询
- spring-boot - 如何不创建重复的 Spring Boot 应用程序日志文件?
- python - 熊猫数据框,在匹配的数据框中按布尔值选择列