我正在SQL
中撰写一些AWS Athena
个问题。我有3个表search
,retrieval
和intent
。在search
表中,我有2列id和术语,即
id term
1 abc
1 bcd
2 def
1 ghd
我想要的是编写一个查询来获取:
id term
1 abc, bcd, ghd
2 def
我知道这可以使用STUFF
和FOR XML PATH
完成,但在Athena中,SQL的所有功能都不受支持。有没有其他方法来实现这一目标。我目前的疑问是:
select search.id , STUFF(
(select ',' + search.term
from search
FOR XML PATH('')),1,1,'')
FROM search
group by search.id
另外,我还有一个问题。我有retrieval
表,由3列组成,即:
id time term
1 0 abc
1 20 bcd
1 100 gfh
2 40 hfg
2 60 lkf
我想要的是:
id time term
1 100 gfh
2 60 lkf
我想根据id
时间值编写一个查询来获取term
和max
。这是我目前的查询:
select retrieval.id, max(retrieval.time), retrieval.term
from search
group by retrieval.id, retrieval.term
order by max(retrieval.time)
我正在获得重复的id以及该术语。我认为这是因为,我在id和term两个方面做group by
。但是,我不确定如何在不使用group by
的情况下实现它。
答案 0 :(得分:1)
XML方法在SQL Server中是破碎的。没有理由在任何其他数据库中尝试它。
一种方法使用数组:
select s.id, array_agg(s.term)
from search s
group by s.id;
因为数据库支持数组,所以您应该学会使用它们。您可以将数组转换为字符串:
select s.id, array_join(array_agg(s.term), ',') as terms
from search s
group by s.id;
答案 1 :(得分:0)
分组依据是一个小组操作:认为你正在调整结果并且必须找到最小值,最大值,计数等。 我只回答一个问题。 使用它来查找问题1的答案 问题2:
select
from (select id, max(time) as time
from search
group by id, term
order by max(time)
) search_1, search as search_2
where search_1.id = search_2.id
and search_1.time = search_2.time