microsoft sql server - 计算每行和最后一行之间的返回值

时间:2014-07-21 20:28:13

标签: sql sql-server

我有一张如下表格:

+-------+--------------+
| Value |       Date   |
+-------+--------------+
|    14 | 10/11/2010   |
|    12 | 10/12/2010   |
|    12 | 10/13/2010   |
|    10 | 10/14/2010   |
|    8  | 10/15/2010   |
|    6  | 10/16/2010   |
|    4  | 10/17/2010   |
|    2  | 10/18/2010   |
+-------+--------------+

我想计算每一行和最后一行(最新日期)之间的回报(商)。例如,对于日期为“10/16/2010”的行,结果应为6/2 = 3

因此,结果表应为

+-------+--------------+
| result|       Date   |
+-------+--------------+
|    7  | 10/11/2010   |
|    6  | 10/12/2010   |
|    6  | 10/13/2010   |
|    5  | 10/14/2010   |
|    4  | 10/15/2010   |
|    3  | 10/16/2010   |
|    2  | 10/17/2010   |
|    1  | 10/18/2010   |
+-------+--------------+

有可能完成吗?谢谢你!

3 个答案:

答案 0 :(得分:0)

您可以获得想要除以的值。由于这总是一行,您可以使用交叉联接来加入并执行您的部门。

SQL Fiddle

with maxdate as
(select max([Date]) as maxdate from table1),
divby as
(select
   value as divby
 from
   table1
 inner join maxdate md
   on md.maxdate = table1.[date])


 select
 value / divby
,[date]
 from
 table1
 cross join divby

为了分解它,第一个CTE(巧妙地命名为maxdate)获得整个事物的最大日期。第二个CTE(divby)获取该最大日期的值(您将除以)。只要您从中获得一行,就可以安全地使用交叉连接,从而导致表中的每一行除以该值。

答案 1 :(得分:0)

表格的另一个可能的解决方案JOIN

SQL Fiddle Example

select (t1b.value / t1a.value) as result, 
  t1b.date from table1 t1a
join table1 t1b on t1a.date = (select max(date) from table1)

答案 2 :(得分:0)

谢谢小提琴,安德鲁!如果2008年及以上(小提琴:http://sqlfiddle.com/#!3/ecda1/11):

,也可以像这样完成
SELECT   [Value] / MIN([Value]) OVER () AS result,
         [Date]
FROM     Table1