第一次使用SQL所以请耐心等待我的是一个愚蠢的错误。
我的数据库有3个表。但是对于此查询,我们只关注ALBUM
表。对于每张专辑,它包含出版年份,艺术家姓名,专辑名称,专辑评级。
我正在努力寻找两张专辑在一定年限内没有进一步分开的结果。
这就是我提出的:
SELECT "ALBUM"."ARTIST"
FROM public."ALBUM"
WHERE NOT EXISTS
(SELECT "A"."ARTIST"
FROM public."ALBUM" AS "A"
WHERE NOT EXISTS
( SELECT "B"."ARTIST"
FROM
public."ALBUM" "A",
public."ALBUM" "B"
WHERE
"A"."TITLE" != "B"."TITLE" AND
"A"."ARTIST" = "B"."ARTIST" AND
"B"."YEAR" <= "A"."YEAR" AND
"B"."YEAR" +4 < "A"."YEAR"
)
)
UNION
SELECT "A"."ARTIST"
FROM public."ALBUM" "A"
WHERE NOT EXISTS
( SELECT "B"."ARTIST"
FROM public."ALBUM" "B"
WHERE "A"."ARTIST" = "B"."ARTIST"
AND "A"."TITLE" != "B"."TITLE") ;
我的想法是:我首先找到所有那些至少存在两张专辑的艺术家,但是对于一张专辑,4年内没有其他专辑,然后我会从所有艺术家的集合中减去这一组。联盟部分是为了向我的结果添加那些只发布了1张专辑的人。
代码在PostgreSQL中运行良好,但返回的数据实际上并没有按照提供的标准进行过滤,因此代码中的某些内容被忽略/无法正常工作但我现在已经停留了一段时间。有提示吗?
答案 0 :(得分:0)
我建议采用两步法:
1:单一自我联接查询找到艺术家。
SELECT "B"."ARTIST"
FROM
public."ALBUM" "A",
public."ALBUM" "B"
WHERE
"A"."TITLE" != "B"."TITLE" AND
"A"."ARTIST" = "B"."ARTIST" AND
"B"."YEAR" < "A"."YEAR" + 4
尝试在NOT EXISTS
子句中包装第一个查询。
SELECT ARTIST FROM public."ALBUM" "C" WHERE NOT EXISTS
(SELECT "B"."ARTIST"
FROM
public."ALBUM" "A",
public."ALBUM" "B"
WHERE
"A"."TITLE" != "B"."TITLE" AND
"A"."ARTIST" = "B"."ARTIST" AND
"A"."ARTIST" = "C"."ARTIST" AND
"B"."YEAR" < "A"."YEAR" + 4)
请注意,必须将EXISTS
的外部和内部查询与某些内容绑定才能使其正常工作。我认为,你对年度比较的条件是相反的。
答案 1 :(得分:0)
组合CTE(公用表表达式)和窗口函数的另一种方法可以如下:
with single_album as
(select artist, count(artist) as albums
from album
group by artist),
album_year_delta as
(select
artist,
album_year,
(album_year -
lag(album_year,1)
over(partition by artist order by album_year)) as year_difference
from album)
select
artist
from single_album
where
albums=1
union
select
artist
from album_year_delta
where year_difference > 4;
注意:为简化起见,我简化了命名约定,因为双引号和表前缀有点重。 希望这会有所帮助。