Month: 一月 2020

使用 partition by 查找并删除 MySQL 数据库中重复的行

在创建 MySQL 数据表的时候,经常会忘记给某个字段添加 unique 索引,但是等到想添加的时候又已经有了重复数据,这时候就需要删除重复数据。

准备数据

本文使用如下的数据作为演示:

CREATE TABLE contacts (
    id INT PRIMARY KEY AUTO_INCREMENT,
    first_name VARCHAR(50) NOT NULL,
    last_name VARCHAR(50) NOT NULL,
    email VARCHAR(255) NOT NULL
);

INSERT INTO contacts (first_name,last_name,email) 
VALUES ('Carine ','Schmitt','carine.schmitt@verizon.net'),
       ('Jean','King','jean.king@me.com'),
       ('Peter','Ferguson','peter.ferguson@google.com'),
       ('Janine ','Labrune','janine.labrune@aol.com'),
       ('Jonas ','Bergulfsen','jonas.bergulfsen@mac.com'),
       ('Janine ','Labrune','janine.labrune@aol.com'),
       ('Susan','Nelson','susan.nelson@comcast.net'),
       ('Zbyszek ','Piestrzeniewicz','zbyszek.piestrzeniewicz@att.net'),
       ('Roland','Keitel','roland.keitel@yahoo.com'),
       ('Julie','Murphy','julie.murphy@yahoo.com'),
       ('Kwai','Lee','kwai.lee@google.com'),
       ('Jean','King','jean.king@me.com'),
       ('Susan','Nelson','susan.nelson@comcast.net'),
       ('Roland','Keitel','roland.keitel@yahoo.com'),
       ('Roland','Keitel','roland.keitel@yahoo.com');

注意其中有一行重复了三次。输入完成后,数据如图所示:

file

查找重复的行

使用 group by 和 having

假设我们要通过 email 字段来查找重复值。通过使用 group by 和 having 子句可以查找到哪些行是重复的。

SELECT
    email,
    COUNT(email)
FROM
    contacts
GROUP BY email
HAVING COUNT(email) > 1;

file

Having 就类似于 Group by 之后的 where 子句。但是这个语句还是很难解决我们的问题,我们只知道发生重复的第一行了,而不知道哪些行是重复的。这时候可以使用 partition by 语句。

使用 partition by 找出所有的重复行

需要注意的是,partition by 只有在 MySQL 8.0 之后才支持,而现在常用的是 5.6 和 5.7 版本。

Partition 语句又叫做窗口聚合语句,也就是说他会把同一个值的行聚合成一个窗口,但是和 Group by 语句不同的是,窗口内的每一个行并没有被压缩成一行,具体说Partition by 的语法是:

window_function_name(expression) 
    OVER (
        [partition_defintion]
        [order_definition]
        [frame_definition]
    )

删除重复的行

删除的方法有很多种,这里介绍两种。

References

  1. https://www.mysqltutorial.org/mysql-window-functions/

But the rumor, sell the fact.

buy the rumor, sell the fact 说的是市场往往具有领先性,在事情还没有落地之前,已经开始抢跑了。等到协议真正签署的时候,也就是利好兑现的时候,当前的市值早已经蕴含了对这个利好成功兑现的预期。所以在真正达成协议的时候,先期在低价买入的一方便会决定卖出以兑现自己的收益。由于这时候卖方变多,如果没有后续利好的情况下,利好兑现反而会导致股价会出现一定的回调。反过来说,有时候利空出尽甚至会带来股价的上扬,当然也是在基本面看好的前提下。举几个例子就很明白啦~

  1. 超出市场预期的例子。中美谈判对峙时期,美国态度强硬。Xi 突然去江西视察了一家稀土企业——金力永磁,并支持稀土是中国的战略资产,必要时候可以限制出口。很明显这是针对美国的嘛,因为这个事情之前市场都没有想到过,原来稀土还能有这么大的价值,所以这就是一件超出市场预期的事情,那么包括金力永磁、宁波韵升之类的一大批稀土企业的股票就都暴涨了。http://finance.sina.com.cn/stock … vhiqay3582814.shtml

  2. 不及市场预期的例子。拼多多三季报营收大增 122%,亏损也扩大了 112.6%,总的来说这份财报有喜有忧,但是股票直接从 $40 掉到了 $30。主要原因是不及预期,也就是说市场之前没想着亏损竟然能这么大,当时的市值已经高估了拼多多的盈利能力。https://xueqiu.com/7700511931/136081485

  3. 超出市场预期的例子。格力的股权交易。由于格力的管理层董明珠和大股东珠海国资委的关系一向不是很好,所以格力的控股权交易让市场充满了担忧。按照 buy the rumor 的说法,在格力被收购的传闻阶段股价就会被抬起来了,但是因为刚刚说的原因,股价反而一直维持在低位。直到靴子落地,高瓴资本正式和管理层签订了协议,没有发生撕逼的事情,格力才开始从 50 多块一路涨到了现在的接近 70。

  4. 利好兑现的例子。这个就太多了,刚开始炒股的时候一看这个年报也不错,那个季报也挺牛逼,觉得买买买就好了,往往就容易入套了。因为一个公司的经营状况不可能是完全保密的,比如说线上的销售数据啊、苹果的出货量啊、原材料的价格啊这些数据只要用心或者花钱都是可以收集到的,那么其实机构们早在报表发布之前已经算准了你盈利到底增加多少。如果存在低估现象的话,早就提前入场了,如果报表符合预期(大概率),那么可能就会确定收益。最近我持仓的一个例子:国联股份,1月9号公布了业绩预增61%-70%,但是随后两天却从最高点还是阴跌了,这就是利好兑现的一个典型。http://stock.jrj.com.cn/2020/01/09192728651513.shtml

回到中美协议这个事情,一方面谈了这么久,早就确定要签了,协议的内容其实两边也都基本 ok,这也就是大家都知道的事情。另一方面,Trump 面临 2020 的大选,是在是不太可能有精力在大选前在折腾了。所以这件事情虽然是个很大的利好,但是不管 A 股还是美股,早就先涨为敬了。协议的落地长远来看肯定是很大的利好,对短期来说,说不定是利空呢。。

所以最重要的有时候不是利好还是利空,重要的是有没有超出或者不及市场(分析师)的预期。市场的预期在哪里找呢?可以先看看券商的研报,一般都有某个股票的目标价位。