使用 POSTGRES 和 eclipselink 的 JPA 日期截断组
JPA date truncation group by using POSTGRES and eclipselink
我正在尝试截断日期,并按值分组。
我试过这个:
JPA
select v.sop, FUNC('DATE_TRUNC', 'day', v.scrappedAt) as dt, sum(v.totalValue)
from TABLE v
where v.coordStatus like 'done%' and (:plant is null or v.target =
:plant) and v.scrappedAt is not null
group by v.sop, dt
我也试过按 FUNC
分组
select v.sop, FUNC('DATE_TRUNC', 'day', v.scrappedAt) as dt, sum(v.totalValue)
from TABLE v
where v.coordStatus like 'done%' and (:plant is null or v.target =
:plant) and v.scrappedAt is not null
group by v.sop, FUNC('DATE_TRUNC', 'day', v.scrappedAt)
错误一样
org.postgresql.util.PSQLException:
ERROR: column "t_mcp_verschrottungs_db_sharepoint.scrappedat"
must appear in the GROUP BY clause or be used in an aggregate function
严格来说,如果 FUNC
是本机 Postgres 函数,那么您的查询应该可以正常工作,并且查询将符合 ANSI。在阅读 之后,Postgres 似乎无法弄清楚这两个 FUNC
调用实际上是同一件事。也许您可以使用相关子查询重新表述总和:
SELECT
v1.sop,
FUNC('DATE_TRUNC', 'day', v1.scrappedAt) AS dt,
(SELECT SUM(totalValue) FROM TABLE v2
WHERE v2.sop = v1.sop AND
FUNC('DATE_TRUNC', 'day', v2.scrappedAt) =
FUNC('DATE_TRUNC', 'day', v1.scrappedAt) AND
v2.acoordStatus LIKE 'done%' AND
(:plant is null OR v2.target = :plant) AND
v2.scrappedAt IS NOT NULL) value_sum
FROM TABLE v1
WHERE
v1.coordStatus LIKE 'done%' AND
(:plant is null OR v1.target = :plant) AND
v1.scrappedAt IS NOT NULL;
如果上述方法不起作用或性能不佳,替代方法是使用本机 Postgres 查询。
我正在尝试截断日期,并按值分组。 我试过这个:
JPA
select v.sop, FUNC('DATE_TRUNC', 'day', v.scrappedAt) as dt, sum(v.totalValue)
from TABLE v
where v.coordStatus like 'done%' and (:plant is null or v.target =
:plant) and v.scrappedAt is not null
group by v.sop, dt
我也试过按 FUNC
select v.sop, FUNC('DATE_TRUNC', 'day', v.scrappedAt) as dt, sum(v.totalValue)
from TABLE v
where v.coordStatus like 'done%' and (:plant is null or v.target =
:plant) and v.scrappedAt is not null
group by v.sop, FUNC('DATE_TRUNC', 'day', v.scrappedAt)
错误一样
org.postgresql.util.PSQLException: ERROR: column "t_mcp_verschrottungs_db_sharepoint.scrappedat" must appear in the GROUP BY clause or be used in an aggregate function
严格来说,如果 FUNC
是本机 Postgres 函数,那么您的查询应该可以正常工作,并且查询将符合 ANSI。在阅读 FUNC
调用实际上是同一件事。也许您可以使用相关子查询重新表述总和:
SELECT
v1.sop,
FUNC('DATE_TRUNC', 'day', v1.scrappedAt) AS dt,
(SELECT SUM(totalValue) FROM TABLE v2
WHERE v2.sop = v1.sop AND
FUNC('DATE_TRUNC', 'day', v2.scrappedAt) =
FUNC('DATE_TRUNC', 'day', v1.scrappedAt) AND
v2.acoordStatus LIKE 'done%' AND
(:plant is null OR v2.target = :plant) AND
v2.scrappedAt IS NOT NULL) value_sum
FROM TABLE v1
WHERE
v1.coordStatus LIKE 'done%' AND
(:plant is null OR v1.target = :plant) AND
v1.scrappedAt IS NOT NULL;
如果上述方法不起作用或性能不佳,替代方法是使用本机 Postgres 查询。