截断日期上的距离(Postgresql)

问题描述 投票:0回答:1

我有一个带有createdAtid字段的表。而且我正试图获得每个月的第一天

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 |
+----------+------------------------------+------------------------+

我想念什么吗?

sql postgresql
1个回答
0
投票

您的逻辑倒退:

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;
© www.soinside.com 2019 - 2024. All rights reserved.