Специальная сортировка TABLE

У меня есть два столбца TABLE из предыдущего запроса:

+--------+--------+
| Id_no1 | Id_no2 |
+--------+--------+
| 1 | 2 |
| 1 | 2 |
| 1 | 3 |
| 1 | 5 |
| 2 | 1 |
| 2 | 3 |
| 2 | 3 |
| 2 | 5 |
| 3 | 1 |
| 3 | 2 |
+--------+--------+

TABLE - ORDER BY Id_no1, Id_no2

Я хочу, чтобы Id_no1 и Id_no2 были спарены следующим образом:

+--------+--------+
| Id_no1 | Id_no2 |
+--------+--------+
| 1 | 2 |
| 1 | 2 |
| 2 | 1 |
| | |
| 1 | 3 |
| 3 | 1 |
| | |
| 1 | 5 |
| | |
| 2 | 3 |
| 2 | 3 |
| 3 | 2 |
| | |
| 2 | 5 |
+--------+--------+

Id_no1 и Id_no2 являются магазинами, отправителем и получателем. Я хочу объединить обмен между всеми магазинами.

2 ответа

Ваше требование, по-видимому, должно сортировать ваши данные в порядке действий сторон. Чтобы сделать это, вы пытаетесь отсортировать сначала самую низкую участвующую сторону (по возрастанию), затем самую высокую участвующую сторону (также восходящую).

Чтобы это сделать, я написал следующее: это дает результат в том порядке, который вы показали, и будет работать... если моя дикая догадка будет удаленно связана с вашим вопросом.

/* Sample Data */

 WITH Table1 AS 
 (
 SELECT ID_No1, ID_No2
 FROM 
 ( VALUES 
 (1,2),
 (1,2),
 (1,3),
 (1,5),
 (2,1),
 (2,3),
 (2,3),
 (2,5),
 (3,1),
 (3,2)
 ) AS VALUE(ID_No1, ID_No2)
 )
/* Query */
 SELECT ID_No1, ID_No2
 FROM 
 (
 SELECT 
 *,
 CASE WHEN ID_No1 > ID_No2 THEN ID_No1 ELSE ID_No2 END AS MaxParty,
 CASE WHEN ID_No1 < ID_No2 THEN ID_No1 ELSE ID_No2 END AS MinParty
 FROM Table1
 ) arr
 ORDER BY MinParty, MaxParty, ID_No1


Может быть, это поможет:

select * from mytab 
order by case when id_no1 < id_no2 then id_no1 else id_no2 end, 
 case when id_no2 > id_no1 then id_no2 else id_no1 end;

= порядок по мин (col1, col2), max (col1, col2)

licensed under cc by-sa 3.0 with attribution.