【问题标题】:SQL: Select another column from a column that has the same valueSQL:从具有相同值的列中选择另一列
【发布时间】:2022-01-01 15:13:34
【问题描述】:

我想从同一组 ID 中选择 ORDER_NUMBER。 其中配对条件如下:

  • A 与 B 配对(A 是主要标签顺序。B 是次要标签顺序)和 B 与 C 配对

  • X 与 Y 配对(X 是主要标签顺序。Y 是次要标签顺序)和 Y 与 Z 配对

      ID   ORDER    ORDER_NUMBER        Tag
      ---+--------+-----------------+---------
      47   48      200000002814           A
      47   49      30000000266600001      B
      47   49      30000000266600000      C
      50   51      200000001999           A
      50   52      30000000266600002      B
      50   52      30000000266605763      C
      ..   ...     ...                    ..
      ..   ...     ...                    ..
      250  251     200000001932           X
      250  252     30000000266600121      Y
      250  252     30000000266605452      Z
    

预期结果:

   Tag_main| Tag_minor| ORDER_NUMBER_main  | ORDER_NUMBER_minor
-------------+--------------+--------------
    A      |    B     | 200000002814       |  30000000266600001
    B      |    C     | 30000000266600001  |  30000000266600000      
    A      |    B     | 200000001999       |  30000000266600002
    B      |    C     | 30000000266600002  |  30000000266605763  
    X      |    Y     | 200000001932       |  30000000266600121
    Y      |    Z     | 30000000266600121  |  30000000266605452  

如何编写代码?

感谢您的帮助

【问题讨论】:

  • 您使用的是哪个 dbms?

标签: sql select


【解决方案1】:

我们可以尝试使用ROW_NUMBER 和自加入:

WITH cte AS (
    SELECT t.*, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Tag) rn
    FROM yourTable t
)

SELECT
    t1.Tag AS Tag_main,
    t2.Tag AS Tag_minor,
    t1.ORDER_NUMBER AS ORDER_NUMBER_main,
    t2.ORDER_NUMBER AS ORDER_NUMBER_minor
FROM cte t1
INNER JOIN cte t2
    ON t2.ID = t1.ID AND t2.rn = t1.rn + 1
ORDER BY
    t1.ID,
    t1.Tag;

Demo

【讨论】:

  • 我已经编辑了它有很多组Tag,它可以使用WHERE和Tag吗?
  • @Karina 只需删除外部查询的WHERE 子句中的限制,它应该仍然有效。
  • 不加入表可以用CASE WHEN吗?
  • 不确定你在问什么。我的方法依赖于自连接,以使父项和子项在输出中的单个记录中对齐。
  • 我的意思是......我可以写 SELECT (CASE WHEN t.RN = 1 THEN t.ORDER_NUMBER WHEN t.RN = 2 THEN t.ORDER_NUMBER END) AS ORDER_NUMBER_main ,但我不知道如何使用 CASE WHEN 查询 ORDER_NUMBER_minor
【解决方案2】:

检查一下 -

create table alpha
(
    ID int,
    [Order] int,
    Order_Number int,
    Tag char
)


insert into alpha
select 1, 123, 7997, 'A' union
select 1, 35, 46, 'B' union
select 1, 46, 464, 'C' union
select 2, 35, 68, 'A' union
select 2, 35, 424, 'B' union
select 2, 35, 799, 'C' union
select 3, 68, 2424, 'A' union
select 3, 5, 7979, 'B' union
select 3, 770, 33, 'C' 



select a.Tag 'tag_major', b.Tag 'tag_minor', a.Order_Number 'order_main', b.Order_Number 'order_minor' from 
alpha a join alpha b
on a.ID = b.ID and a.Tag = CHAR(ASCII(b.Tag) - 1)
order by a.ID

【讨论】:

    猜你喜欢
    • 2019-05-31
    • 2017-12-24
    • 2017-02-14
    • 2012-05-25
    • 1970-01-01
    • 2019-08-03
    • 2014-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多