在MySQL

时间:2017-09-30 00:32:51

标签: mysql enumeration

所以我回答了this question一段时间,现在我遇到了一个令人讨厌的变化。

说我有这张桌子:

ID  Date        Special 
1   2001-01-11  1      
1   2003-03-03      
1   2002-02-22  1       
2   2001-01-11  1      
2   2002-02-22  1       

我需要按日期枚举这些记录,但也取决于记录是否标记为Special

理想的输出是这样的:

ID  Date        Special  Num 
1   2001-01-11  1        1      
1   2003-03-03      
1   2002-02-22  1        2
2   2001-01-11  1        1
2   2002-02-22  1        1

这是表格:

CREATE TEMPORARY TABLE temp_table(id INT, dt DATE, Special INT);
INSERT INTO temp_table VALUES
(1, '2001-01-11', 1),
(1, '2003-03-03', NULL),
(1, '2002-02-22', 1),
(2, '2001-01-11', 1),
(2, '2002-02-22', 1);

我希望能够修改我对上述问题所得到的答案,但是它使用了SQL的声明性方面,我很糟糕。谢谢你看这个!

1 个答案:

答案 0 :(得分:2)

我看了上一个问题......答案看起来像是你要问的一点点。这是一个较短的版本。

select @ctr := if(@id = id,@ctr+1,1) ctr
       ,dt date
       ,@id :=id id
       from q43381823
       order by id,dt

如果你想将所有特殊排除在一起那么......

select @ctr := if(@id = id,@ctr+1,1) ctr
       ,dt date
       ,@id :=id id
       from q43381823
       where special = 'Y'
       order by id,dt

然后如果你想要包含特殊字段,这将有效......

select @ctr := if(@id = id,@ctr+1,1) ctr
       ,dt
       ,@id :=id id
       ,special
       from q43381823
       where special = 'Y'
union
select '' as ctr, dt , id, special
       from q43381823
       where special <> 'Y'
       order by id,dt

另外,我使用了另一个问题的创建表。

CREATE TABLE q43381823(id INT, dt DATE, special varchar(1));
INSERT INTO q43381823 VALUES
(1, '2001-01-11','Y'),
(1, '2003-03-03',''),
(1, '2002-02-22', 'Y'),
(2, '2001-01-11', 'Y'),
(2, '2002-02-22', 'Y');