PostgreSQL DISTINCT ON

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

我无法定义别名或选择特定的列,只能用通配符。

工作:

SELECT DISTINCT ON (r.InsertDate) *  
FROM public.server AS s
LEFT JOIN public.Report AS r ON s.Id = r.ServerId
ORDER BY r.InsertDate DESC;

不工作:

SELECT DISTINCT ON (r.InsertDate) LastReport, s.Id, s.Servername 
FROM public.server AS s
LEFT JOIN public.Report AS r ON s.Id = r.ServerId
ORDER BY r.InsertDate DESC;

錯誤

ERROR:  column "lastreport" does not exist
LINE 1:  SELECT DISTINCT ON (r.InsertDate) LastReport, s.Id, s.Serve...
                                           ^
SQL state: 42703
Character: 36

也不能用。

SELECT DISTINCT ON (r.InsertDate) , s.Id, s.Servername 
FROM public.server AS s
LEFT JOIN public.Report AS r ON s.Id = r.ServerId
ORDER BY r.InsertDate DESC;
ERROR:  column "lastreport" does not exist
LINE 1:  SELECT DISTINCT ON (r.InsertDate) LastReport, s.Id, s.Serve...
                                           ^
SQL state: 42703
Character: 36

ERROR:  syntax error at or near ","
LINE 1:  SELECT DISTINCT ON (r.InsertDate) , s.Id, s.Servername 
                                           ^
SQL state: 42601
Character: 36

有什么办法吗?

sql postgresql distinct
1个回答
0
投票

你似乎对以下问题感到困惑 DISTINCT ON. 它不是 "返回一列"。 它是一个语法结构。 这些都是 SELECT:

SELECT ALL
SELECT DISTINCT
SELECT DISTINCT ON ()

(第一种是默认的,在实践中从未使用过。)

栏目表 随之 这些结构。 所以,显然你想。

SELECT DISTINCT ON (r.InsertDate) r.InsertDate as LastReport, s.Id, s.Servername 
FROM public.server s LEFT JOIN
     public.Report r
     ON s.Id = r.ServerId
ORDER BY r.InsertDate DESC;

原来 DISTINCT ON 实际上是在其余的 SELECT 子句,所以你可以使用列别名。

SELECT DISTINCT ON (LastReport) r.InsertDate as LastReport, s.Id, s.Servername 
FROM public.server s LEFT JOIN
     public.Report r
     ON s.Id = r.ServerId
ORDER BY LastReport DESC;

然而,别名必须在列列表中的 distinct on.

请注意,您使用的是 LEFT JOIN所以 r.InsertDate 可以NULLL.

© www.soinside.com 2019 - 2024. All rights reserved.