如果这似乎与this question重复,请道歉,但我相信我的用例略有不同。
我有两张桌子。
Table1
ID INTCODE
-----------------------------
000019827364 1
000019829201 2
890418392101 3
890418390395 4
890418398677 5
505586578932 6
505586578914 7
505586578933 8
505586578012 9
490201827383 10
490201827466 11
001952046578 12
Table2
INTCODE Category
-------------------------
1 Display
2 Display
3 Display
4 Display
5 Display
6 Audio
7 Audio
8 Audio
9 Audio
10 Audio
11 Audio
12 Audio
我期望的查询结果是每个类别的所有可能的5位前缀,并且在每个前缀中 - 我想提取至少2个完整ID。下面是一个例子,如果我有一个类别的where子句为'显示'。
ID PREFIX Category ID
-----------------------------------------------
00001 Display 000019827364
00001 Display 000019829201
89041 Display 890418392101
89041 Display 890418390395
我目前的查询是
SELECT
SUBSTR(t1.ID, 1, 5)
FROM
table1 t1
,table2 t2
WHERE
AND UPPER(t2.category) = 'DISPLAY'
AND t2.REGION_ID = 1
AND t2.ZONE_ID = 2
AND t1.REGION_ID = 1
AND t1.ZONE_ID = 2
AND t1.INTCODE = t2.INTCODE
GROUP BY
SUBSTR(t1.ID, 1, 5)
我现在有点迷茫。我应该在我说
的地方运行另一个查询t1.ID LIKE '00001%'
OR LIKE '89041%'
此列表将继续是巨大的,因为某些类别有400-500个前缀。有没有更好的方法来解决这个问题?可能在一个查询中?
我正在使用Oracle SQL。
非常感谢!
答案 0 :(得分:1)
您可以使用row_number()
:
select Category, ID, IDPrefix
from (select Category, ID, SUBSTR(ID, 1, 5) as IDPREFIX,
ROW_NUMBER() OVER (PARTITION BY SUBSTR(ID, 1, 5) ORDER BY ID) as seqnum
FROM table1 JOIN
table2 t2
ON t1.INTCODE = t2.INTCODE ANd
t1.Region_id = t2.Region_id and
t1.zone_id = t2.zone_id
WHERE UPPER(t2.category) = 'DISPLAY'
) t
WHERE seqnum <= 2;
答案 1 :(得分:0)
假设您可以显示具有不同Id的两行,而不再有任何约束,您可以简单地使用union
,其中第一个查询将选择最大ID,第二个查询最小ID。
所以你的查询看起来像这样
select id_prefix, category, max(id)
from yourTable
union
select id_prefix, category, min(id)
from yourTable
现在只需在此算法中添加您的条件。