我有一个带有createdAt
和id
字段的表。而且我正试图获得每个月的第一天
SELECT * FROM (
SELECT DISTINCT ON ("date") DATE_TRUNC('month', "createdAt") AS "date", "createdAt"
FROM
"walletBalances"
WHERE
"walletId" = 1
ORDER BY
"date" DESC) t
ORDER BY
"createdAt" DESC;
此查询转换为此
+----------+------------------------------+
| walletId | createdAt |
+----------+------------------------------+
| 1 | 2019-11-20 20:00:00.00000+03 |
+----------+------------------------------+
| 1 | 2019-11-21 20:00:00.00000+03 |
+----------+------------------------------+
| 1 | 2019-10-17 20:00:00.00000+03 |
+----------+------------------------------+
| 1 | 2019-10-14 20:00:00.00000+03 |
+----------+------------------------------+
为此
+----------+------------------------------+------------------------+
| walletId | createdAt | date |
+----------+------------------------------+------------------------+
| 1 | 2019-11-21 20:00:00.00000+03 | 2019-11-01 00:00:00+03 |
+----------+------------------------------+------------------------+
| 1 | 2019-10-17 20:00:00.00000+03 | 2019-10-01 00:00:00+03 |
+----------+------------------------------+------------------------+
问题是DISTINCT ON ("date") DATE_TRUNC('month', "createdAt") AS "date"
使用2019-10-17 20:00:00.00000+03
作为唯一字段(?),但表中显示的早期日期2019-10-14 20:00:00.00000+03
不多。
如何获得这样的结果?因此DISTINCT ON
将始终使用最小的日期。
+----------+------------------------------+------------------------+
| walletId | createdAt | date |
+----------+------------------------------+------------------------+
| 1 | 2019-11-21 20:00:00.00000+03 | 2019-11-01 00:00:00+03 |
+----------+------------------------------+------------------------+
| 1 | 2019-10-14 20:00:00.00000+03 | 2019-10-01 00:00:00+03 |
+----------+------------------------------+------------------------+
我想念什么吗?
您的逻辑倒退:
SELECT DISTINCT ON (DATE_TRUNC('month', "createdAt"))
DATE_TRUNC('month', "createdAt") AS "date", "createdAt"
FROM "walletBalances"
WHERE "walletId" = 1
ORDER BY date ASC;
如果您确实希望结果按降序排列,则可以使用子查询。
或者您可以使用聚合:
SELECT DATE_TRUNC('month', "createdAt") AS "date", MIN("createdAt") as first_date_in_month
FROM "walletBalances"
WHERE "walletId" = 1
GROUP BY "date"
ORDER BY date DES;