通过考虑oracle中的列值来优先获取行

时间:2017-04-04 14:44:35

标签: sql oracle

我有4列,如下所示,第一列是主键,

Col1 Col2 Col3   Pk
---- ---- ------ --
 112 Liq  Tall    1
 112 asf  Small   2
 113 Asf  S1      3
 113 fgs  S2      4
 115 Mid  F1      5

在这里,我需要根据第2列中的值来对行进行操作,而不向其添加任何新列。

喜欢" LIQ"那么它是第一优先。所有其他人都有正常的优先权,我们将其作为先到先得。

我们得到如下输出:

Col1 Col2 Col3   Pk
---- ---- ------ --
 112 Liq  Tall    1
 113 Asf  S1      3
 115 Mid  F1      5

2 个答案:

答案 0 :(得分:0)

我现在无法访问SQL数据库进行测试,但我通常解决此问题的方法是创建“优先级”表。

priority_term     priority_weighting
-------------------------------------
Liq                               10

然后,您可以使用外部联接,并按priority_weighting排序,例如:

select Col1,
       Col2,
       Col3,
       Pk, 
       isnull(priority_weigthing, -1)
from my_table mt
outer join prioritization p
  on mt.col2 = p.priority_term
order by p.priority_weighting desc

答案 1 :(得分:0)

以这种方式:

WITH your_table AS (SELECT 112 col1, 'Liq' col2, 'Tall' col3, 1 pk FROM dual UNION ALL
                    SELECT 112 col1, 'asf' col2, 'Small' col3, 2 pk FROM dual UNION ALL
                    SELECT 113 col1, 'Asf' col2, 'S1' col3, 3 pk FROM dual UNION ALL
                    SELECT 113 col1, 'fgs' col2, 'S2' col3, 4 pk FROM dual UNION ALL
                    SELECT 115 col1, 'Mid' col2, 'F1' col3, 5 pk FROM dual)
-- end of data setup; see SQL below
SELECT col1,
       col2,
       col3,
       pk
FROM   (SELECT col1,
               col2,
               col3,
               pk,
               row_number() OVER (PARTITION BY col1 ORDER BY CASE WHEN UPPER(col2) = 'LIQ' THEN 1 ELSE 2 END, col2 ASC) rn
        FROM   your_table)
WHERE  rn = 1
ORDER BY col1;

      COL1 COL2 COL3          PK
---------- ---- ----- ----------
       112 Liq  Tall           1
       113 Asf  S1             3
       115 Mid  F1             5

这是通过在每个col1值上为每一行分配一个行号,并首先通过检查col2的大写值是否为" LIQ"来排序它。并给出最小的数字(在我的例子中,1)和其他一切更高的数字(在我的例子中,2)\然后按col2升序排序。

如果需要对行进行不同的排序,则需要修改ROW_NUMBER()分析函数中ORDER BY语句的第二部分。

最后,一旦行标有行号,您就可以通过选择标有" 1"的行来过滤它们。

*此时您可以使用Neville的解决方案而不是硬编码优先级值 - 即拥有一个包含优先级值的单独表,并将其连接到您的表并使用优先级首先在ROW_NUMBER()函数中排序的值。