如何使用瀑布效果或逻辑查询条目

时间:2014-06-25 19:25:26

标签: sql sql-server

我正在尝试构建一个按层次结构顺序过滤的查询

在表格IDBANK中,只有三列,IDALIAS_IDALIAS_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

3 个答案:

答案 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)

SQL Fiddle

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也在数字上表示类似的进展。