SQL:按父字段进行子查询过滤

SQL: Subquery filter by parent field

我有以下 SQL 查询,我无法开始工作。

数据架构

| Timestamp                | Status   | Amount |
|--------------------------|----------|--------|
| 2016-03-23T08:03:34.204Z | Approved |   100  |
| 2016-03-23T16:00:06.755Z | Declined |   450  |
| 2016-03-30T10:18:43.846Z | Approved | 50010  |

期望的输出

| Date       | Approved Count | Declined Count |
|------------|----------------|----------------|
| 2016-03-23 | 1              | 1              |
| 2016-03-30 | 1              | 0              |

我试过的

SELECT DATE(timestamp) AS Date,

  (SELECT COUNT(*)
   FROM db.transactions
   WHERE status='Approved'
     AND DATE(timestamp)=Date) AS Approved,

  (SELECT COUNT(*)
   FROM db.transactions
   WHERE status='Declined') AS Declined
FROM db.transactions a
GROUP BY Date;

.. 失败并显示错误消息:

An error occurred with Amazon Redshift. column "date" does not exist

    SELECT DATE(timestamp),

  (SELECT COUNT(*)
   FROM db.transactions
   WHERE status='Approved'
     AND DATE(timestamp) AS Approved,

  (SELECT COUNT(*)
   FROM db.transactions
   WHERE status='Declined') AS Declined
FROM db.transactions GROUP BY Date;

您收到的错误是由于尝试在 GROUP BY 子句中使用 SELECT 子句中定义的列别名,该别名不可用,因为 GROUP BY 实际上是在 SELECT 之前处理。您可以使用 GROUP BY DATE(timestamp) 来消除错误,但是使用条件聚合可以更有效地完成此操作:

SELECT DATE(timestamp) AS Date
      ,SUM(CASE WHEN status='Approved' THEN 1 ELSE 0 END) AS Approved
      ,SUM(CASE WHEN status='Declined' THEN 1 ELSE 0 END) AS Declined
FROM db.transactions
GROUP BY  DATE(timestamp)