tsql - 在选择 ID 后跟 CASE 时限制/聚合结果
问题描述
试图从日志表中提取一些数据。
我在下面使用的查询的简化版本:
SELECT
type_id AS type_id
, CASE WHEN LogOperation = 'Insert' THEN CreateDT ELSE NULL END AS create_date
, CASE WHEN (AuditID > 0 OR AuditID IS NOT NULL) AND OldVal_AuditID IS NULL THEN LogTimeStamp ELSE NULL END AS audit_date
FROM TypeLOG
ORDER BY type_id
样本结果集:
|---------|-------------|------------|
| type_id | create_date | audit_date |
|---------|-------------|------------|
| 176 | 2019-06-01 | NULL |
| 177 | 2019-06-01 | NULL |
| 177 | NULL | 2019-06-03 |
| 178 | 2019-06-03 | NULL |
| 178 | NULL | 2019-06-04 |
| 178 | NULL | NULL |
我怎样才能提取这些数据,以便每个 type_id 只显示 1 行?这是一个日志表,因此其他操作(如更新和删除)自然会为每个 type_id 创建多行。
与此相关,理论上每个 type_id 可以有多个“插入”......我想基于最早的 LogTimeStamp,我想每个 type_id 都有第一个“插入”。
我需要如何修改我的查询以反映这一点?
谢谢!
解决方案
你必须做 CTE 或自我加入,它应该看起来像这样
WITH CTE1 AS (
SELECT TYPE_ID,
CASE WHEN LogOperation = 'Insert' THEN CreateDT ELSE NULL END AS create_date
FROM TypeLOG
), CTE2 (
SELECT TYPE_ID,
CASE WHEN (AuditID > 0 OR AuditID IS NOT NULL) AND OldVal_AuditID IS NULL THEN LogTimeStamp ELSE NULL END AS audit_date
FROM TypeLOG
)
SELECT CTE1.TYPE_ID, CREATE_DATE, AUDIT_DATE
FROM CTE1 JOIN CTE2
ON CTE1.TYPE_ID = CTE2.TYPE_ID
ORDER BY TYPE_ID
推荐阅读
- mysql - 如何将 SQL 表中的所有值转换为具有多列的单行
- linq - 如何将 FirstOrDefaultAsync EF Linq 返回到实体列表查询
- apache-kafka - kstream-ktable join实现后如何处理Apache kafka中丢失的数据
- asp.net - web.config 在 IIS 10 上正常工作并在 IIS 8.5 上返回 403 错误
- java - 依赖管理中的冗余
- sql - 我如何使用 Microsoft SQL MANAGER 上的 SQL 过滤这个新的 IIF 列的位置
- grid - 顺风网格部分的自动高度
- javascript - 插入jquery javascript后选择元素
- jboss - 迁移到 JBOSS 7.4 和 Java11 后未正确注入 EJB 无状态 bean
- pyspark - 如何在 Spark 中将文件路径值读取为列?