通过SQL基于日期组合(连接)行

时间:2016-09-16 13:50:23

标签: sql concatenation teradata

我有下表。

Animal  Vaccine_Date    Vaccine
Dog     1/1/2016        x
Dog     2/1/2016        y
Dog     2/1/2016        z
Cat     2/1/2016        y
Cat     2/1/2016        z

我希望能够将同一动物和同一日期的疫苗结合起来,以便它们出现在同一个细胞中。下表是期望的最终结果。

Animal  Vaccine_Date    Vaccine
Dog     1/1/2016        x
Dog     2/1/2016        y,z
Cat     2/1/2016        y,z

我曾尝试创建一个易变的表,但我没有运气,我也不认为Teradata会识别Group_concat。

3 个答案:

答案 0 :(得分:1)

更新20180419

Teradata(不确定是哪个版本)添加了XMLAGG,这是一个比递归更好的选择)

原始回答:

Teradata没有group_concat / listagg功能。有几种解决方法。我最喜欢的是使用递归CTE。它不是非常有效,但它有很好的文档和支持功能。

在你的情况下:

WITH RECURSIVE recCTE AS
    (
        SELECT 
            Animal, 
            Vaccine_Date,
            CAST(min(Vaccine) as VARCHAR(50)) as vaccine_list, --big enough to hold concatenated list 
            1 as depth, --used to determine the largest/last group_concate (the full group) in the final SELECT
            Vaccine

        FROM table
        GROUP BY 1,2


        UNION ALL

        SELECT 
            recCTE.Animal,
            recCTE.Vaccine_Date,
            recCTE.Vaccine || ',' || table.Vaccine
            recCTE.depth + ,
            table.Vaccine
        FROM recCTE 
            INNER JOIN table ON
                recCTE.Animal = table.Animal AND
                recCTE.Vaccine_Date =  Table.Vaccine_Date
                table.vaccine > recCTE.vaccine
    )

    --Now select the result with the largest depth for each animal/vaccine_date combo
    SELECT * FROM recCTE
    QUALIFY ROW_NUMBER() OVER (PARTITION BY animal,vaccine_date ORDER BY depth desc) = 1

您可能需要稍微调整一下(可能在连接之前修剪疫苗值等等),但它应该让您进入大球场。您可以查看递归CTE文档at this link,但它非常干燥。如果您不熟悉,那里也有很多教程。 Teradata的递归CTE实现与T-SQL和PostgresSQL的实现非常相似。

作为另一个选项,您可以查看尚未记录的tdstats.udfconcat(),正如Teradata社区网站上this thread中极其知识渊博的@dnoeth所解释的那样。

答案 1 :(得分:0)

试试这个。 STUFF功能是这种情况的理想选择:

  SELECT
     Animal, Vaccine_Date,
     STUFF(
         (SELECT DISTINCT ',' + Vaccine
          FROM TableName
          WHERE Animal = a.Animal AND Vaccine_Date = a.Vaccine_Date
          FOR XML PATH (''))
          , 1, 1, '')  AS VaccineList
FROM TableName AS a
GROUP BY Animal, Vaccine_Date

答案 2 :(得分:-1)


您可以使用此查询,

  SELECT 
   Animal,Vaccine_Date,
   LISTAGG(Vaccine, ',') WITHIN GROUP (ORDER BY Vaccine) "names"
   FROM table_name
   GROUP BY Vaccine

希望你明白了