#sql-server #compare #case
Вопрос:
Это трудно объяснить, поэтому я сделаю все, что в моих силах.
У меня есть эта таблица (существуют другие cols, но они не имеют отношения к моему запросу).
CREATE TABLE ClientRelationships
(
Client1 VARCHAR(10) NOT NULL,
Client2 VARCHAR(10) NULL
)
INSERT INTO ClientRelationships (Client1, Client2)
VALUES ('C12345', 'C67890'),
('C54353', 'C76345'),
('C76345', 'C54353'),
('C73246', NULL),
('C67890', 'C12345')
Клиент1 | Клиент2 |
---|---|
C12345 | C67890 |
C54353 | C76345 |
C76345 | C54353 |
C73246 | нулевой |
C67890 | C12345 |
Как вы можете видеть из данных, есть строки, в которых значение Client1 отображается в другой строке как Client2. В этих случаях я хочу отметить первое вхождение как «Первичное», а второе-как «Вторичное» (где значение Client1 находится в столбце Client2 в другой строке). Может быть, просто как логический столбец под названием «Основной», установленный в 0 или 1.
Если в столбце Client2 нет значения (NULL), для основного столбца будет установлено значение 1
Результат, надеюсь, будет выглядеть так с моими примерами данных.
Клиент1 | Клиент2 | Первичный |
---|---|---|
C12345 | C67890 | 1 |
C54353 | C76345 | 1 |
C76345 | C54353 | 0 |
C73246 | нулевой | 1 |
C67890 | C12345 | 0 |
Надеюсь, в этом есть смысл.
Я использую SQL Server 2019, но все, что начиная с 2012 года и выше, может быть удовлетворено, так как у меня есть экземпляры всех.
Записи не всегда отображаются в таблице одновременно.
Я действительно не уверен, как подойти к этому, поэтому ищу несколько советов.
Комментарии:
1. Существует ли столбец, например идентификатор или дата, который определяет порядок строк?
Ответ №1:
Если есть столбец, определяющий порядок строк , например an ID
, то вы можете сделать это с CASE
помощью выражения и EXISTS
:
SELECT c1.*,
CASE
WHEN EXISTS(SELECT 1 FROM ClientRelationships c2 WHERE c2.ID < c1.ID AND c2.Client2 = c1.Client1) THEN 0
ELSE 1
END [Primary]
FROM ClientRelationships c1
Или с соответствующим подзапросом:
SELECT c1.*,
(
SELECT COALESCE(MAX(0), 1)
FROM ClientRelationships c2
WHERE c2.ID < c1.ID AND c2.Client2 = c1.Client1
) [Primary]
FROM ClientRelationships c1
Смотрите демонстрацию.
Комментарии:
1. Спасибо за помощь, это именно то, что мне нужно. К сожалению, столбца идентификатора нет (он взят из CSV-файла), но я могу добавить его с помощью row_number(). Теперь это мой код, и он отлично работает.
;WITH c1 AS ( SELECT ROW_NUMBER() OVER (ORDER BY Client1) AS ID , Client1, Client2 FROM ClientRelationships ) SELECT c1.*, CASE WHEN EXISTS(SELECT 1 FROM c1 c2 WHERE c2.ID < c1.ID AND c2.Client2 = c1.Client1) THEN 0 ELSE 1 END [Primary] FROM c1