我有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
答案 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()函数中排序的值。