我有一个MySQL表如下:id,date和多个int
字段,带0/1。每行中只有一个int
字段包含单个1,其他列全部为0.每个id
可以重复日期。
id | date | isX | isY | isZ
-------+--------------+-----+-----+-----
111111 | '1994-04-09' | 0 | 1 | 0
222222 | '1991-07-29' | 1 | 0 | 0
222222 | '1991-07-29' | 0 | 1 | 0
333333 | '1993-06-29' | 0 | 0 | 1
333333 | '1993-06-29' | 0 | 1 | 0
333333 | '1996-04-09' | 0 | 1 | 0
我想为每个id
获取一行,最早的日期和每个int
列中的1行(如果id
和日期的任何行都为1(0)否则)。
id | date | isX | isY | isZ
-------+--------------+-----+-----+-----
111111 | '1994-04-09' | 0 | 1 | 0
222222 | '1991-07-29' | 1 | 1 | 0
333333 | '1993-06-29' | 0 | 1 | 1
我使用以下命令合并int
列
select id,
if(sum(isX)>0,1,0) as isX,
if(sum(isY)>0,1,0) as isY,
if(sum(isZ)>0,1,0) as isZ
from table group by id;
但我不确定如何仅使用具有最小日期的行以及如何将日期添加到输出。
答案 0 :(得分:1)
你在那里,只需添加min(date)
select id,
min(`date`) as mindate,
if(sum(isX)>0,1,0) as isX,
if(sum(isY)>0,1,0) as isY,
if(sum(isZ)>0,1,0) as isZ
from table
group by id;
如果您不想要行date
不是id' s min(日期)的每个ID的行,那么您需要一个子查询:
select id,
`date`
if(sum(isX)>0,1,0) as isX,
if(sum(isY)>0,1,0) as isY,
if(sum(isZ)>0,1,0) as isZ
from table
INNER JOIN (SELECT id, min(date) as mindate FROM table GROUP BY id) sub1 ON
table.id = sub1.id AND
table.`date` = sub1.`date`
group by id, `date`;
现在,if(sum(isx...
逻辑仅用于date
为min(date)
的{{1}}的记录。