SQL

时间:2018-03-06 21:49:22

标签: sql amazon-athena

我正在SQL中撰写一些AWS Athena个问题。我有3个表searchretrievalintent。在search表中,我有2列id和术语,即

id                 term
1                   abc
1                   bcd
2                   def
1                   ghd

我想要的是编写一个查询来获取:

id                  term
1               abc, bcd, ghd
2                    def

我知道这可以使用STUFFFOR 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时间值编写一个查询来获取termmax。这是我目前的查询:

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的情况下实现它。

2 个答案:

答案 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