首页 > 解决方案 > 在选择 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 都有第一个“插入”。

我需要如何修改我的查询以反映这一点?

谢谢!

标签: tsqlssms

解决方案


你必须做 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

推荐阅读