MySQL模拟滞后以减少旧服务器上的冗余项



Bottom Line Up Front:我正试图找到一种方法来格式化输出,以便在某些数据与前一行匹配时将其留空。

我按照@philipxy的建议进行了编辑,因为我真的想学习如何编写更好的代码和编写更好的问题来支持这种学习。

话虽如此,@ysth还是能够解决我过于复杂的问题。我更改了标题并标记为已回答。

这是我的数据库中的一个示例表:(SELECT codename, dt_begin, id_alias FROM aliases GROUP BY codename;(

+--------------+------------+----------+
| codename     | dt_begin   | id_alias |
+--------------+------------+----------+
| Arachniblade | 1999-12-23 |        1 |
| Arachniblade | 2016-07-04 |        2 |
| Beta         | 2015-06-03 |        1 |
| Beta         | 2016-07-04 |        3 |
| Cyberwolf    | 2016-07-04 |        1 |
+--------------+------------+----------+

当使用ORDER BY codename时,我希望"Arachniblade"one_answers"Beta"的第二个(以及任何后续(实例为空。

+--------------+------------+----------+
| codename     | dt_begin   | id_alias |
+--------------+------------+----------+
| Arachniblade | 1999-12-23 |        1 |
|              | 2016-07-04 |        2 |
| Beta         | 2015-06-03 |        1 |
|              | 2016-07-04 |        3 |
| Cyberwolf    | 2016-07-04 |        1 |
+--------------+------------+----------+

同样,如果我ORDER BY id_alias,我希望只打印一次id 1,但仍然保留"Arachniblade"、"Beta"one_answers"Cyberwolf"的所有三个记录

+--------------+------------+----------+
| codename     | dt_begin   | id_alias |
+--------------+------------+----------+
| Arachniblade | 1999-12-23 |        1 |
| Beta         | 2015-06-03 |          |
| Cyberwolf    | 2016-07-04 |          |
| Arachniblade | 2016-07-04 |        2 |
| Beta         | 2016-07-04 |        3 |
+--------------+------------+----------+

正如@ysth所提到的,LAG((是解决方案的一部分。我还不确定COALESCE是怎么适应的。

所以您不想GROUP BY任何内容,但希望Codename在等于前一行的Codename的地方为空?你可以选择这个而不仅仅是别名。域名:

IF(COALESCE(LAG(aliases.codename) OVER (),'')=aliases.codename,'',aliases.codename) AS 'Codename'

假设mysql8.0或mariadb 10.2+。完整查询:

SELECT IF(COALESCE(LAG(aliases.codename) OVER (),'')=aliases.codename,'',aliases.codename) AS 'Codename',
aliases.dt_begin,
public_ids.fname,
public_ids.suffix
FROM   public_ids
JOIN   aliases ON aliases.id_alias 
WHERE  aliases.id_alias = public_ids.id
ORDER BY aliases.codename, aliases.dt_begin

(您在查询中省略了ORDER BY;如果没有指定的订单,那么这样做没有多大意义。(

在旧版本上,您可以使用一个变量模拟LAG((:

SELECT IF(COALESCE(@lag,'')=aliases.codename,'',@lag:=aliases.codename) AS 'Codename',
aliases.dt_begin,
public_ids.fname,
public_ids.suffix
FROM   (select @lag:=NULL) initvars
CROSS JOIN public_ids
JOIN   aliases ON aliases.id_alias 
WHERE  aliases.id_alias = public_ids.id
ORDER BY aliases.codename, aliases.dt_begin

最新更新