2011-01-13 235 views
0

我有两个查询返回双精度值的单柱:司在SQL查询语句

(SELECT scale 
    FROM (SELECT title, 
       scale, 
       dense_rank() OVER (PARTITION BY title 
             ORDER BY scale ASC) AS r 
      FROM signatures) t 
    WHERE r = 1) 

...和:

(SELECT scale 
    FROM (SELECT scale, 
       dense_rank() OVER (PARTITION BY title 
             ORDER BY scale ASC) AS r 
      FROM signatures) t 
    WHERE r = 2) 

我想选择第一个查询( Q1)除以第二个查询(Q2)。即,(Q1的第1行)/(Q2的第1行)。并继续沿着其余的行。

我曾尝试:

SELECT ((SELECT scale 
      FROM (SELECT title, 
         scale, 
         dense_rank() OVER (PARTITION BY title 
               ORDER BY scale ASC) AS r 
        FROM signatures) t 
      WHERE r = 1) 

/

(SELECT scale 
    FROM (SELECT scale, 
       dense_rank() OVER (PARTITION BY title 
             ORDER BY scale ASC) AS r 
      FROM signatures) t 
    WHERE r = 2) 
) 

但有没有运气。 任何人都可以看到一种方法来做到这一点?我可以分别发送这两个查询,然后运行一个循环并分割元素,但这不适用于半大记录集。

此外,它应该不重要,但我使用PostgreSQL。

+1

你知道如果处理关系,`DENSE_RANK`会返回相同的值吗?例如,您可以将三个实例并列第二名,这会导致您的分区发生悲伤...... – 2011-01-13 16:47:42

+0

@OMG。好的,但是如果我单独运行查询,我会得到正确的列结果。是不可能在一个陈述中分开这两个? – Brett 2011-01-13 17:01:28

回答

1

我想你想使用LEAD窗口函数,而不是获得两组并试图加入它们。这允许您在同一个窗口中引用另一行(即匹配partition by)。类似:

select title, scale/next_scale 
from (select title, scale, 
       lead(scale) over(partition by title order by scale asc) as next_scale, 
       row_number() over(partition by title order by scale asc) as agg_row 
     from signatures 
    ) agg 
where agg_row = 1; 

这里,lead(scale)需要从scale列中的值是在同一窗口中输出,即,在顺序中的下一最规模。我们仍然需要预测row_number()并对其进行筛选,以便我们只获取每个窗口中第一行的输出行,即每个标题最小的行。

0

你需要给SQL一些方法来知道每列中的哪一个数字除以哪个数字。试试这个:

SELECT first.title, (first.scale/second.scale) ratio 
     FROM 
      (SELECT scale, title 
       FROM (SELECT title, scale, 
          dense_rank() OVER 
          (PARTITION BY title ORDER BY scale ASC) AS r 
         FROM signatures) t 
      WHERE r = 1) first 
INNER JOIN 
      (SELECT scale, title 
       FROM (SELECT title, scale, 
          dense_rank() OVER 
          (PARTITION BY title ORDER BY scale ASC) AS r 
         FROM signatures) t 
      WHERE r = 2) second 
     ON first.title = second.title 

由于OMG评论说,如果最终得到几个相同的比例值,DENSE_RANK可能会给你带来麻烦。如果适合您的逻辑,您可能希望将每个子查询限制为每个标题一行,或者在外部查询中指定SELECT DISTINCT,因为重复项将完全重复。