所以我回答了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的声明性方面,我很糟糕。谢谢你看这个!
答案 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');