sql-server - SQL。创建一个查询,将在非连续年份中查找非空金额
问题描述
我需要找到任何在非连续年份利润不为零的公司(例如 2007 年利润 = 10,000.00;2008 年利润 = 零;2009 年利润 = 12,000.00)。
以下是数据示例:
Company year Profit
ABW 2004 22566.68216
ABW 2005 23302.83199
ABW 2006 24015.42061
ABW 2007 25921.28214
ABW 2008 27549.34573
ABW 2009 24639.93533
ABW 2010 24289.14152
ABW 2011 25354.78247
ABW 2012 ---
AFG 2004 220.0562878
AFG 2005 252.4078925
AFG 2006 275.3509409
AFG 2007 373.5914162
AFG 2008 ----
AFG 2009 450.659239
AFG 2010 561.1976175
AFG 2011 613.9791916
AFG 2012 687.245475
AGO 2004 1229.342988
AGO 2005 1706.543616
AGO 2006 2440.631716
AGO 2007 3412.718998
AGO 2008 ----
AGO 2009 ----
AGO 2010 4218.649126
AGO 2011 5159.233666
AGO 2012 5482.428049
ALB 2004 2320.89233
ALB 2005 2620.820724
ALB 2006 2872.260625
ALB 2007 3380.894192
ALB 2008 4108.414124
谢谢你的帮助!
jb
解决方案
这就是你所追求的吗?
IF OBJECT_ID('tempdb..#TestData', 'U') IS NOT NULL
BEGIN DROP TABLE #TestData; END;
CREATE TABLE #TestData (
company CHAR(3) NOT NULL,
[year] INT NOT NULL,
profit DECIMAL(18,10) NULL
);
INSERT #TestData (company, year, profit) VALUES
('ABW', 2004, 22566.68216),
('ABW', 2005, 23302.83199),
('ABW', 2006, 24015.42061),
('ABW', 2007, 25921.28214),
('ABW', 2008, 27549.34573),
('ABW', 2009, 24639.93533),
('ABW', 2010, 24289.14152),
('ABW', 2011, 25354.78247),
('ABW', 2012, NULL),
('AFG', 2004, 220.0562878),
('AFG', 2005, 252.4078925),
('AFG', 2006, 275.3509409),
('AFG', 2007, 373.5914162),
('AFG', 2008, NULL),
('AFG', 2009, 450.659239 ),
('AFG', 2010, 561.1976175),
('AFG', 2011, 613.9791916),
('AFG', 2012, 687.245475 ),
('AGO', 2004, 1229.342988),
('AGO', 2005, 1706.543616),
('AGO', 2006, 2440.631716),
('AGO', 2007, 3412.718998),
('AGO', 2008, NULL),
('AGO', 2009, NULL),
('AGO', 2010, 4218.649126),
('AGO', 2011, 5159.233666),
('AGO', 2012, 5482.428049),
('ALB', 2004, 2320.89233 ),
('ALB', 2005, 2620.820724),
('ALB', 2006, 2872.260625),
('ALB', 2007, 3380.894192),
('ALB', 2008, 4108.414124);
--==============================================
SELECT
*
FROM (
SELECT
td.company,
td.year,
td.profit,
prev_prof_year = MAX(CASE WHEN td.profit IS NOT NULL THEN td.year END) OVER (PARTITION BY td.company ORDER BY td.year ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING)
FROM
#TestData td
) ppy
WHERE
ppy.profit IS NOT NULL
AND ppy.year = ppy.prev_prof_year + 2;
结果:
company year profit prev_prof_year
------- ----------- --------------------------------------- --------------
AFG 2009 450.6592390000 2007
推荐阅读
- javascript - 如何向页面中的所有元素添加多个 onclick 事件
- c - 如果指针存储了一个变量的地址,并且本身就是一个变量,那它是不是会创建无限指针并填满整个系统内存呢?
- java - 在 javaFXML 文件中键入以使用 GmapsFX
- postgresql - 使用外键约束更新列是否可以锁定引用的表?
- android - 为什么创建 toast 消息的绑定函数不通过注释通过绑定 OnClick 显示?
- javascript - 选择文件ExtJs后如何重置文件字段
- html - 参考书目和引文的微格式/模式
- javascript - 如何替换字符串和圆形小时中的时间戳?
- ios - uitapgesture 仅在点击 3 次后响应
- apache-spark - 用于预测的 Spark 中的 PMML 执行