You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user-zh@flink.apache.org by 王双利 <al...@163.com> on 2020/04/26 09:18:49 UTC

sql 行转列

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 这样不能行转列,有解决方案吗?



Re: sql 行转列

Posted by Jark Wu <im...@gmail.com>.
>  这个执行的结果是 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 <xb...@gmail.com> 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,王双利 <al...@163.com> 写道:
> >
> > 没找到 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 <xb...@gmail.com> 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
>
>

Re: sql 行转列

Posted by Leonard Xu <xb...@gmail.com>.
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,王双利 <al...@163.com> 写道:
> 
> 没找到 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 <xb...@gmail.com> 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


Re: Re: sql 行转列

Posted by 王双利 <al...@163.com>.
 没找到 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 <xb...@gmail.com> 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

Re: sql 行转列

Posted by Jark Wu <im...@gmail.com>.
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 <xb...@gmail.com> 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

Re: sql 行转列

Posted by Leonard Xu <xb...@gmail.com>.
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

Re: Re: sql 行转列

Posted by 王双利 <al...@163.com>.
        这个执行的结果是 successct,failct总有一个是0,两个不能共存



王双利
 
发件人: Benchao Li
发送时间: 2020-04-26 20:30
收件人: user-zh
主题: Re: sql 行转列
现在看起来你最开始发的SQL就可以做到你说的这个需求呀。
 
王双利 <al...@163.com> 于2020年4月26日周日 下午6:47写道:
 
> 原始存的是ip status 次数,status是成功或者失败,想达到的是统计一个ip的成功和失败次数,在一行里面显示
>
>
> | |
> 王双利
> |
> |
> 邮箱:allon2@163.com
> |
>
> 签名由 网易邮箱大师 定制
>
> 在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
>
> 王双利 <al...@163.com> 于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: libenchao@gmail.com; libenchao@pku.edu.cn
>
 
 
-- 
 
Benchao Li
School of Electronics Engineering and Computer Science, Peking University
Tel:+86-15650713730
Email: libenchao@gmail.com; libenchao@pku.edu.cn

Re: sql 行转列

Posted by Benchao Li <li...@gmail.com>.
现在看起来你最开始发的SQL就可以做到你说的这个需求呀。

王双利 <al...@163.com> 于2020年4月26日周日 下午6:47写道:

> 原始存的是ip status 次数,status是成功或者失败,想达到的是统计一个ip的成功和失败次数,在一行里面显示
>
>
> | |
> 王双利
> |
> |
> 邮箱:allon2@163.com
> |
>
> 签名由 网易邮箱大师 定制
>
> 在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
>
> 王双利 <al...@163.com> 于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: libenchao@gmail.com; libenchao@pku.edu.cn
>


-- 

Benchao Li
School of Electronics Engineering and Computer Science, Peking University
Tel:+86-15650713730
Email: libenchao@gmail.com; libenchao@pku.edu.cn

回复:sql 行转列

Posted by 王双利 <al...@163.com>.
原始存的是ip status 次数,status是成功或者失败,想达到的是统计一个ip的成功和失败次数,在一行里面显示


| |
王双利
|
|
邮箱:allon2@163.com
|

签名由 网易邮箱大师 定制

在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

王双利 <al...@163.com> 于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: libenchao@gmail.com; libenchao@pku.edu.cn

Re: Re: sql 行转列

Posted by Kurt Young <yk...@gmail.com>.
从你的原始sql看起来,我猜测你是想在做统计的时候,要套用一个过滤条件?从你的原始sql我没看出任何和“行转列”相关的迹象和需求,能否详细解释一下

Best,
Kurt


On Sun, Apr 26, 2020 at 6:20 PM Benchao Li <li...@gmail.com> 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
>
> 王双利 <al...@163.com> 于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
> >
> > 王双利 <al...@163.com> 于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: libenchao@gmail.com; libenchao@pku.edu.cn
> >
>
>
> --
>
> Benchao Li
> School of Electronics Engineering and Computer Science, Peking University
> Tel:+86-15650713730
> Email: libenchao@gmail.com; libenchao@pku.edu.cn
>

Re: Re: sql 行转列

Posted by Benchao Li <li...@gmail.com>.
你指的是多行转多行么?如果是的话,那你需要的应该是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

王双利 <al...@163.com> 于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
>
> 王双利 <al...@163.com> 于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: libenchao@gmail.com; libenchao@pku.edu.cn
>


-- 

Benchao Li
School of Electronics Engineering and Computer Science, Peking University
Tel:+86-15650713730
Email: libenchao@gmail.com; libenchao@pku.edu.cn

Re: Re: sql 行转列

Posted by 王双利 <al...@163.com>.
   看到的例子,都是 对单行数据进行转行的,这种多行数据的,有相关例子吗?
 
发件人: 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
 
王双利 <al...@163.com> 于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: libenchao@gmail.com; libenchao@pku.edu.cn

Re: sql 行转列

Posted by Benchao Li <li...@gmail.com>.
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

王双利 <al...@163.com> 于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: libenchao@gmail.com; libenchao@pku.edu.cn