我正在尝试构建一个按层次结构顺序过滤的查询
在表格IDBANK
中,只有三列,ID
,ALIAS_ID
和ALIAS_ID_CD
。
每个ID
可以包含多个ALIAS_ID
,而每个ALIAS_ID
将包含一个ALIAS_ID_CD
。例如,如果ALIAS_ID
以A开头,则ALIAS_ID_CD
将为A.
我想通过{B}> A> D> C排列IDBANK
,从ID
查询所有唯一的ALIAS_ID_CD
。唯一的问题是,我希望只为我的层次结构中最高的ID
获取不同的ALIAS_ID_CD
。
对于值的子集:
ID ALIAS_ID ALIAS_ID_CD
1 A10 A
1 B10 B
1 C10 C
1 D10 D
2 D20 D
2 B20 B
2 C20 C
3 D30 D
3 A30 A
我想回复以下内容:
ID ALIAS_ID ALIAS_ID_CD
1 B10 B
2 B20 B
3 A30 A
答案 0 :(得分:1)
SELECT m.*
FROM (
SELECT DISTINCT
id
FROM mytable
) md
JOIN mytable m
ON (m.id, m.alias_id) =
(
SELECT mi.id, mi.alias_id
FROM mytable mi
WHERE mi.id = md.id
ORDER BY
mi.id, mi.alias_id
LIMIT 1
)
<强>更新强>
在SQL Server中,那将是:
SELECT id, alias_id, alias_id_cd
FROM (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY id ORDER BY alias_id) rn
FROM mytable
) q
WHERE rn = 1
答案 1 :(得分:1)
SELECT ID, ALIAS_ID, ALIAS_ID_CD
FROM (
SELECT *,
ROW_NUMBER() OVER( PARTITION BY ID
ORDER BY
ID,
CASE ALIAS_ID_CD
WHEN 'B' THEN 1
WHEN 'A' THEN 2
WHEN 'C' THEN 3
WHEN 'D' THEN 4
END,
ALIAS_ID
) ROWNUM
FROM IDBANK
) SUB
WHERE ROWNUM = 1;
这里要认识到的重要一点是,您已经指定了一个排序(例如,B-A-C-D),这与标准ASCII排序不同。这就是使用CASE语句的原因。
查询的内容是将表分成子集(按ID分区)并应用行号以正确序列化子集(按...排序)。完成后,您只想查看每个子集中的第一条记录 - 这就是您必须在外部查询上应用WHERE ROWNUM=1
的原因。
答案 2 :(得分:0)
稍微简单且成本较低的版本:
select id, min(alias_id) as alias_id, min(alias_id_cd) AS alias_id_cd
from mytable
group by id
使数据假设与您的样本数据类似,如果alias_id_cd的字母顺序较高,则在您的层次结构中更高,并且alias_id也在数字上表示类似的进展。