对 PostgreSQL 中的 unnest 元素进行分类

Classify unnest elements in PostgreSQL

我正在使用 PostgreSQL 10.6,我想读取一个包含日期数组的 table。我的目标是对该数组中的每个日期进行分类,并将其与当天的日期进行比较,以影响它们的类别:过去、现在、未来。

通过 case 语句,我已经根据记录的值对记录进行了分类,另一方面,我能够从该数组中取消嵌套元素。但是当我在 unnest 元素中尝试 case 语句时,响应不是我所期望的。

我的表格

id(integer) | dates(date[])
---------------------------
1           | {2020-03-17}
2           | {2020-03-17,2020-03-16}
3           | {2020-03-16,2020-03-15}
4           | {2020-03-17,2020-03-18}
5           | {2020-03-16,2020-03-18}

一个简单的查询 return 每个日期在不同的行中

SELECT id, UNNEST(dates) FROM myTable

另一个查询 return 我的结果不是很好,因为显示了一些过去的日期 "Futur" 例如。

SELECT
    id,
    UNNEST(dates),
    CASE
        WHEN dates < ARRAY[now()::date] THEN 'Past'
        WHEN dates = ARRAY[now()::date] THEN 'Present'
        WHEN dates > ARRAY[now()::date] THEN 'Futur'
    END AS myResult
FROM myTable
ORDER BY UNNEST(dates) DESC

我怎样才能获得这个结果?我想我遗漏了一些重要的东西。

id |     dates     |   myResult
--------------------------------
4  | {2020-03-18}  |   Futur
5  | {2020-03-18}  |   Futur
1  | {2020-03-17}  |   Present
2  | {2020-03-17}  |   Present
4  | {2020-03-17}  |   Present
2  | {2020-03-16}  |   Past
3  | {2020-03-16}  |   Past
5  | {2020-03-16}  |   Past
3  | {2020-03-15}  |   Past

您需要在 from 子句中取消嵌套 - 然后您可以在 from 子句中进行分类:

SELECT
    t.id,
    d.dt,
    CASE
        WHEN d.dt < current_date THEN 'Past'
        WHEN d.dt = current_date THEN 'Present'
        WHEN d.dt > current_date THEN 'Futur'
    END AS myResult
FROM myTable t
CROSS JOIN LATERAL UNNEST(t.dates) d(dt)
ORDER BY t.id, d.dt DESC

Demo on DB Fiddle:

id | dt         | myresult
-: | :--------- | :-------
 1 | 2020-03-17 | Present
 2 | 2020-03-17 | Present
 2 | 2020-03-16 | Past
 3 | 2020-03-16 | Past
 3 | 2020-03-15 | Past
 4 | 2020-03-18 | Futur
 4 | 2020-03-17 | Present
 5 | 2020-03-18 | Futur
 5 | 2020-03-16 | Past