select ip,
case status when 'success' THEN sum(t) ELSE 0 end successct, case status when 'fail' THEN sum(t) ELSE 0 end failct from view1 group by ip 这样不能行转列,有解决方案吗? |
Hi 双利,
在Flink里面行转列用的是Table Function,你可以参考下[1] 里面的 ”Join with Table Function (UDTF)“ 部分。 [1] https://ci.apache.org/projects/flink/flink-docs-master/dev/table/sql/queries.html#joins 王双利 <[hidden email]> 于2020年4月26日周日 下午5:19写道: > select ip, > case status when 'success' THEN sum(t) ELSE 0 end successct, > case status when 'fail' THEN sum(t) ELSE 0 end failct > from view1 > group by ip 这样不能行转列,有解决方案吗? > > > -- Benchao Li School of Electronics Engineering and Computer Science, Peking University Tel:+86-15650713730 Email: [hidden email]; [hidden email] |
看到的例子,都是 对单行数据进行转行的,这种多行数据的,有相关例子吗?
发件人: Benchao Li 发送时间: 2020-04-26 17:31 收件人: user-zh 主题: Re: sql 行转列 Hi 双利, 在Flink里面行转列用的是Table Function,你可以参考下[1] 里面的 ”Join with Table Function (UDTF)“ 部分。 [1] https://ci.apache.org/projects/flink/flink-docs-master/dev/table/sql/queries.html#joins 王双利 <[hidden email]> 于2020年4月26日周日 下午5:19写道: > select ip, > case status when 'success' THEN sum(t) ELSE 0 end successct, > case status when 'fail' THEN sum(t) ELSE 0 end failct > from view1 > group by ip 这样不能行转列,有解决方案吗? > > > -- Benchao Li School of Electronics Engineering and Computer Science, Peking University Tel:+86-15650713730 Email: [hidden email]; [hidden email] |
你指的是多行转多行么?如果是的话,那你需要的应该是Table Aggregate Function[1],但是这个只能在Table Api里使用,
在SQL里面没有这种语义可以直接使用。 [1] https://ci.apache.org/projects/flink/flink-docs-master/dev/table/functions/udfs.html#table-aggregation-functions 王双利 <[hidden email]> 于2020年4月26日周日 下午6:14写道: > 看到的例子,都是 对单行数据进行转行的,这种多行数据的,有相关例子吗? > > 发件人: Benchao Li > 发送时间: 2020-04-26 17:31 > 收件人: user-zh > 主题: Re: sql 行转列 > Hi 双利, > > 在Flink里面行转列用的是Table Function,你可以参考下[1] 里面的 ”Join with Table Function > (UDTF)“ 部分。 > > [1] > > https://ci.apache.org/projects/flink/flink-docs-master/dev/table/sql/queries.html#joins > > 王双利 <[hidden email]> 于2020年4月26日周日 下午5:19写道: > > > select ip, > > case status when 'success' THEN sum(t) ELSE 0 end successct, > > case status when 'fail' THEN sum(t) ELSE 0 end failct > > from view1 > > group by ip 这样不能行转列,有解决方案吗? > > > > > > > > -- > > Benchao Li > School of Electronics Engineering and Computer Science, Peking University > Tel:+86-15650713730 > Email: [hidden email]; [hidden email] > -- Benchao Li School of Electronics Engineering and Computer Science, Peking University Tel:+86-15650713730 Email: [hidden email]; [hidden email] |
从你的原始sql看起来,我猜测你是想在做统计的时候,要套用一个过滤条件?从你的原始sql我没看出任何和“行转列”相关的迹象和需求,能否详细解释一下
Best, Kurt On Sun, Apr 26, 2020 at 6:20 PM Benchao Li <[hidden email]> wrote: > 你指的是多行转多行么?如果是的话,那你需要的应该是Table Aggregate Function[1],但是这个只能在Table Api里使用, > 在SQL里面没有这种语义可以直接使用。 > > [1] > > https://ci.apache.org/projects/flink/flink-docs-master/dev/table/functions/udfs.html#table-aggregation-functions > > 王双利 <[hidden email]> 于2020年4月26日周日 下午6:14写道: > > > 看到的例子,都是 对单行数据进行转行的,这种多行数据的,有相关例子吗? > > > > 发件人: Benchao Li > > 发送时间: 2020-04-26 17:31 > > 收件人: user-zh > > 主题: Re: sql 行转列 > > Hi 双利, > > > > 在Flink里面行转列用的是Table Function,你可以参考下[1] 里面的 ”Join with Table Function > > (UDTF)“ 部分。 > > > > [1] > > > > > https://ci.apache.org/projects/flink/flink-docs-master/dev/table/sql/queries.html#joins > > > > 王双利 <[hidden email]> 于2020年4月26日周日 下午5:19写道: > > > > > select ip, > > > case status when 'success' THEN sum(t) ELSE 0 end successct, > > > case status when 'fail' THEN sum(t) ELSE 0 end failct > > > from view1 > > > group by ip 这样不能行转列,有解决方案吗? > > > > > > > > > > > > > -- > > > > Benchao Li > > School of Electronics Engineering and Computer Science, Peking University > > Tel:+86-15650713730 > > Email: [hidden email]; [hidden email] > > > > > -- > > Benchao Li > School of Electronics Engineering and Computer Science, Peking University > Tel:+86-15650713730 > Email: [hidden email]; [hidden email] > |
In reply to this post by 王双利
原始存的是ip status 次数,status是成功或者失败,想达到的是统计一个ip的成功和失败次数,在一行里面显示
| | 王双利 | | 邮箱:[hidden email] | 签名由 网易邮箱大师 定制 在2020年04月26日 18:14,王双利 写道: 看到的例子,都是 对单行数据进行转行的,这种多行数据的,有相关例子吗? 发件人: Benchao Li 发送时间: 2020-04-26 17:31 收件人: user-zh 主题: Re: sql 行转列 Hi 双利, 在Flink里面行转列用的是Table Function,你可以参考下[1] 里面的 ”Join with Table Function (UDTF)“ 部分。 [1] https://ci.apache.org/projects/flink/flink-docs-master/dev/table/sql/queries.html#joins 王双利 <[hidden email]> 于2020年4月26日周日 下午5:19写道: > select ip, > case status when 'success' THEN sum(t) ELSE 0 end successct, > case status when 'fail' THEN sum(t) ELSE 0 end failct > from view1 > group by ip 这样不能行转列,有解决方案吗? > > > -- Benchao Li School of Electronics Engineering and Computer Science, Peking University Tel:+86-15650713730 Email: [hidden email]; [hidden email] |
现在看起来你最开始发的SQL就可以做到你说的这个需求呀。
王双利 <[hidden email]> 于2020年4月26日周日 下午6:47写道: > 原始存的是ip status 次数,status是成功或者失败,想达到的是统计一个ip的成功和失败次数,在一行里面显示 > > > | | > 王双利 > | > | > 邮箱:[hidden email] > | > > 签名由 网易邮箱大师 定制 > > 在2020年04月26日 18:14,王双利 写道: > 看到的例子,都是 对单行数据进行转行的,这种多行数据的,有相关例子吗? > > 发件人: Benchao Li > 发送时间: 2020-04-26 17:31 > 收件人: user-zh > 主题: Re: sql 行转列 > Hi 双利, > > 在Flink里面行转列用的是Table Function,你可以参考下[1] 里面的 ”Join with Table Function > (UDTF)“ 部分。 > > [1] > > https://ci.apache.org/projects/flink/flink-docs-master/dev/table/sql/queries.html#joins > > 王双利 <[hidden email]> 于2020年4月26日周日 下午5:19写道: > > > select ip, > > case status when 'success' THEN sum(t) ELSE 0 end successct, > > case status when 'fail' THEN sum(t) ELSE 0 end failct > > from view1 > > group by ip 这样不能行转列,有解决方案吗? > > > > > > > > -- > > Benchao Li > School of Electronics Engineering and Computer Science, Peking University > Tel:+86-15650713730 > Email: [hidden email]; [hidden email] > -- Benchao Li School of Electronics Engineering and Computer Science, Peking University Tel:+86-15650713730 Email: [hidden email]; [hidden email] |
In reply to this post by 王双利
Hi,
> select ip, > case status when 'success' THEN sum(t) ELSE 0 end successct, > case status when 'fail' THEN sum(t) ELSE 0 end failct > from view1 > group by ip 这个 sql 应该ok的,看讨论也可以满足你的需求,是有报错吗?麻烦贴下报错和 view1的大致逻辑 Best, Leonard Xu |
Administrator
|
Hi
如果我理解的没错,agg with filter 语法能满足你的需求。 select ip, sum(t) filter (where status = 'success') sum(t) filter (where status = 'fail') from view1 group by ip Best, Jark On Sun, 26 Apr 2020 at 20:56, Leonard Xu <[hidden email]> wrote: > Hi, > > > select ip, > > case status when 'success' THEN sum(t) ELSE 0 end successct, > > case status when 'fail' THEN sum(t) ELSE 0 end failct > > from view1 > > group by ip > > 这个 sql 应该ok的,看讨论也可以满足你的需求,是有报错吗?麻烦贴下报错和 view1的大致逻辑 > > Best, > Leonard Xu |
In reply to this post by Benchao Li
这个执行的结果是 successct,failct总有一个是0,两个不能共存
王双利 发件人: Benchao Li 发送时间: 2020-04-26 20:30 收件人: user-zh 主题: Re: sql 行转列 现在看起来你最开始发的SQL就可以做到你说的这个需求呀。 王双利 <[hidden email]> 于2020年4月26日周日 下午6:47写道: > 原始存的是ip status 次数,status是成功或者失败,想达到的是统计一个ip的成功和失败次数,在一行里面显示 > > > | | > 王双利 > | > | > 邮箱:[hidden email] > | > > 签名由 网易邮箱大师 定制 > > 在2020年04月26日 18:14,王双利 写道: > 看到的例子,都是 对单行数据进行转行的,这种多行数据的,有相关例子吗? > > 发件人: Benchao Li > 发送时间: 2020-04-26 17:31 > 收件人: user-zh > 主题: Re: sql 行转列 > Hi 双利, > > 在Flink里面行转列用的是Table Function,你可以参考下[1] 里面的 ”Join with Table Function > (UDTF)“ 部分。 > > [1] > > https://ci.apache.org/projects/flink/flink-docs-master/dev/table/sql/queries.html#joins > > 王双利 <[hidden email]> 于2020年4月26日周日 下午5:19写道: > > > select ip, > > case status when 'success' THEN sum(t) ELSE 0 end successct, > > case status when 'fail' THEN sum(t) ELSE 0 end failct > > from view1 > > group by ip 这样不能行转列,有解决方案吗? > > > > > > > > -- > > Benchao Li > School of Electronics Engineering and Computer Science, Peking University > Tel:+86-15650713730 > Email: [hidden email]; [hidden email] > -- Benchao Li School of Electronics Engineering and Computer Science, Peking University Tel:+86-15650713730 Email: [hidden email]; [hidden email] |
In reply to this post by Jark
没找到 filter这个语法
王双利 发件人: Jark Wu 发送时间: 2020-04-26 23:50 收件人: user-zh 主题: Re: sql 行转列 Hi 如果我理解的没错,agg with filter 语法能满足你的需求。 select ip, sum(t) filter (where status = 'success') sum(t) filter (where status = 'fail') from view1 group by ip Best, Jark On Sun, 26 Apr 2020 at 20:56, Leonard Xu <[hidden email]> wrote: > Hi, > > > select ip, > > case status when 'success' THEN sum(t) ELSE 0 end successct, > > case status when 'fail' THEN sum(t) ELSE 0 end failct > > from view1 > > group by ip > > 这个 sql 应该ok的,看讨论也可以满足你的需求,是有报错吗?麻烦贴下报错和 view1的大致逻辑 > > Best, > Leonard Xu |
Hi,
FILTER是SQL标准里的语法,可以参考[1] FLINK SQL是支持该语法的,类似的例子官网文档可以参考 [2]中最后的例子 Best, Leonard Xu [1] https://modern-sql.com/feature/filter <https://modern-sql.com/feature/filter> [2]https://ci.apache.org/projects/flink/flink-docs-master/zh/dev/table/tuning/streaming_aggregation_optimization.html <https://ci.apache.org/projects/flink/flink-docs-master/zh/dev/table/tuning/streaming_aggregation_optimization.html> > 在 2020年4月27日,05:51,王双利 <[hidden email]> 写道: > > 没找到 filter这个语法 > > > > 王双利 > > 发件人: Jark Wu > 发送时间: 2020-04-26 23:50 > 收件人: user-zh > 主题: Re: sql 行转列 > Hi > > 如果我理解的没错,agg with filter 语法能满足你的需求。 > > select ip, > sum(t) filter (where status = 'success') > sum(t) filter (where status = 'fail') > from view1 > group by ip > > Best, > Jark > > On Sun, 26 Apr 2020 at 20:56, Leonard Xu <[hidden email]> wrote: > >> Hi, >> >>> select ip, >>> case status when 'success' THEN sum(t) ELSE 0 end successct, >>> case status when 'fail' THEN sum(t) ELSE 0 end failct >>> from view1 >>> group by ip >> >> 这个 sql 应该ok的,看讨论也可以满足你的需求,是有报错吗?麻烦贴下报错和 view1的大致逻辑 >> >> Best, >> Leonard Xu |
Administrator
|
> 这个执行的结果是 successct,failct总有一个是0,两个不能共存
你的测试集是什么样的呢?理论上如果测试集是: ip | t | status ---------------- ip1 | 1 | success ip1 | 2 | failed ip1 | 3 | success ip1 | 4 | failed 那么出来的结果应该是 ip | succss sum | failed sum -------------------------------------- ip1| 4 | 6 如果总有一个是0,那可能的原因是源数据中同一个 ip key 的数据只有一条。 Best, Jark On Mon, 27 Apr 2020 at 09:37, Leonard Xu <[hidden email]> wrote: > Hi, > > FILTER是SQL标准里的语法,可以参考[1] > FLINK SQL是支持该语法的,类似的例子官网文档可以参考 [2]中最后的例子 > > Best, > Leonard Xu > > [1] https://modern-sql.com/feature/filter < > https://modern-sql.com/feature/filter> > [2] > https://ci.apache.org/projects/flink/flink-docs-master/zh/dev/table/tuning/streaming_aggregation_optimization.html > < > https://ci.apache.org/projects/flink/flink-docs-master/zh/dev/table/tuning/streaming_aggregation_optimization.html > > > > 在 2020年4月27日,05:51,王双利 <[hidden email]> 写道: > > > > 没找到 filter这个语法 > > > > > > > > 王双利 > > > > 发件人: Jark Wu > > 发送时间: 2020-04-26 23:50 > > 收件人: user-zh > > 主题: Re: sql 行转列 > > Hi > > > > 如果我理解的没错,agg with filter 语法能满足你的需求。 > > > > select ip, > > sum(t) filter (where status = 'success') > > sum(t) filter (where status = 'fail') > > from view1 > > group by ip > > > > Best, > > Jark > > > > On Sun, 26 Apr 2020 at 20:56, Leonard Xu <[hidden email]> wrote: > > > >> Hi, > >> > >>> select ip, > >>> case status when 'success' THEN sum(t) ELSE 0 end successct, > >>> case status when 'fail' THEN sum(t) ELSE 0 end failct > >>> from view1 > >>> group by ip > >> > >> 这个 sql 应该ok的,看讨论也可以满足你的需求,是有报错吗?麻烦贴下报错和 view1的大致逻辑 > >> > >> Best, > >> Leonard Xu > > |
Free forum by Nabble | Edit this page |