name year sale
a 2013 10
a 2012 8
a 2011 7
b 2013 10
b 2012 14
b 2011 9
c 2013 15
c 2012 12
c 2011 10
sale 连续两年增长的公司是a,c,如何用sqllite语句抽取出来?
------解决思路----------------------
1,业务需求如下:
NAME YEAR sale
a 2013 10
a 2012 8
a 2011 7
b 2013 10
b 2012 14
b 2011 9
c 2013 15
c 2012 12
c 2011 10
sale 连续两年增长的公司是a,c,如何用sqllite语句抽取出来?
2,开始准备录入数据
数据录入sql如下:
DROP TABLE IF EXISTS tb;
CREATE TABLE tb (cname VARCHAR(20),cyear INT, csale INT);
INSERT INTO tb
SELECT "a", 2013 ,10 UNION ALL
SELECT "a", 2012 , 8 UNION ALL
SELECT "a", 2011 , 7 UNION ALL
SELECT "b", 2013 , 10 UNION ALL
SELECT "b", 2012 , 14 UNION ALL
SELECT "b", 2011 , 9 UNION ALL
SELECT "c", 2013 , 15 UNION ALL
SELECT "c", 2012 , 12 UNION ALL
SELECT "c", 2011 , 10 ;
录入数据执行结果展示如下:
sqlite> .headers ON
sqlite> .MODE COLUMN
sqlite> CREATE TABLE tb (cname VARCHAR(20),cyear INT, csale INT);
sqlite> INSERT INTO tb
...> SELECT "a", 2013 ,10 UNION ALL
...> SELECT "a", 2012 , 8 UNION ALL
...> SELECT "a", 2011 , 7 UNION ALL
...> SELECT "b", 2013 , 10 UNION ALL
...> SELECT "b", 2012 , 14 UNION ALL
...> SELECT "b", 2011 , 9 UNION ALL
...> SELECT "c", 2013 , 15 UNION ALL
...> SELECT "c", 2012 , 12 UNION ALL
...> SELECT "c", 2011 , 10 ;
sqlite> SELECT * FROM tb;
cname cyear csale
---------- ---------- ----------
a 2013 10
a 2012 8
a 2011 7
b 2013 10
b 2012 14
b 2011 9
c 2013 15
c 2012 12
c 2011 10
sqlite>
3,开始写sql测试
SELECT DISTINCT t3.cname
FROM tb t3
WHERE NOT EXISTS(
SELECT t1.cname FROM tb t1
WHERE t1.csale<(SELECT t2.`csale` FROM tb t2 WHERE t2.`cname`=t1.cname AND t2.cyear=t1.cyear-1)
AND t1.cname=t3.cname);
执行结果如下:
sqlite> SELECT DISTINCT t3.cname
...> FROM tb t3
...> WHERE NOT EXISTS(
...> SELECT t1.cname FROM tb t1
...> WHERE t1.csale<(SELECT t2.`csale` FROM tb t2 WHERE t2.`cname`=t1.cname AND t2.cyear=t1.cyear-1)
...> AND t1.cname=t3.cname);
cname
----------
a
c
sqlite>
------解决思路----------------------
SELECT DISTINCT t3.cname
FROM tb t3
WHERE NOT EXISTS(
SELECT t1.cname FROM tb t1
WHERE t1.csale<(SELECT t2.`csale` FROM tb t2 WHERE t2.`cname`=t1.cname AND t2.cyear=t1.cyear-1)
AND t1.cname=t3.cname);