【问题标题】:Enumerate records sequentially, grouped and by date, with an indicator column, in MySQL在 MySQL 中使用指示符列按顺序、分组和按日期枚举记录
【发布时间】:2017-09-30 09:01:30
【问题描述】:

所以我不久前询问了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 的声明性方面。谢谢你看这个!

【问题讨论】:

  • 嗯....你认为这值得吗?我会做一个你认为我应该... 想想看,这实际上是关于 SQL 的更烦人的事情之一。当我发现自己在问关于 R、Python 的问题时,创建 MCVE 非常简单快捷……但 MySQL 只是……blech。
  • 有几点不清楚。如果不是按日期,行是如何排序的?为什么不使用标准日期格式 YYYY-MM-DD?当不是'Y' 时,特殊列是NULL 还是''?当组中的第一行有特殊而不是'Y'时,您想如何处理?
  • 提示:mysqldump mydatabase mytable 为您提供了 MCVE 所需的很多内容。它为所涉及的表输出SHOW CREATE TABLE,以及方便的INSERT 语句中的数据。然后你可以把它修剪成你可以做成 SQLFiddle 的东西。
  • 知道了!感谢您向我指出这一点。我会澄清这个问题。

标签: mysql enumeration


【解决方案1】:

我查看了上一个问题...答案似乎与您所要求的相比有点多。这是一个较短的版本。

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');  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    • 2021-11-26
    相关资源
    最近更新 更多