Вопрос
Пожалуйста, рассмотрите следующую таблицу:
+--------------+--------+--------+
| transactionID | Sgroup | Rgroup |
+--------------+--------+--------+
| 1 | A | I |
| 1 | A | J |
| 2 | B | B |
| 2 | B | K |
+--------------+--------+--------+
Для каждого transactionID
(2 строки связаны с ID 1, две строки с ID 2) я хочу выбрать строку, для которой Sgroup = Rgroup
, если какая-либо строка в пределах transactionID
удовлетворяет условию. В противном случае, я хочу выбрать строку случайным образом. Для каждого transactionID
самое большее одна строка удовлетворяет Sgroup = Rgroup
. Как я могу это сделать?
Попытка решения
Я знаю, как выбрать строки, для которых выполняется условие Sgroup = Rgroup
, следующим образом:
SELECT *
FROM Transaction
WHERE Sgroup = Rgroup;
+---------------+--------+--------+
| transactionID | Sgroup | Rgroup |
+---------------+--------+--------+
| 2 | B | B |
+---------------+--------+--------+
Я также знаю, как выбрать строку случайным образом (благодаря этот вопрос ), если условие не выполняется следующим образом:
SELECT * FROM
(SELECT *
FROM Transaction
WHERE NOT transactionID IN
(SELECT transactionID
FROM Transaction
WHERE Sgroup = Rgroup)
ORDER BY RAND()) AS temp
GROUP BY temp.transactionID;
+---------------+--------+--------+
| transactionID | Sgroup | Rgroup |
+---------------+--------+--------+
| 1 | A | I |
+---------------+--------+--------+
Как я могу объединить эти два выражения в одно? Я пытался работать с выражением CASE, которое я не получил далеко Может кто-нибудь любезно предложить решение?
Пример кода Вот код для генерации таблицы:
CREATE DATABASE MinimalExample;
USE MinimalExample;
CREATE TABLE Transaction (
transactionID int,
Sgroup nvarchar(1),
Rgroup nvarchar(1)
);
INSERT INTO Transaction VALUES
(1,'A','I'),
(1,'A','J'),
(2,'B','B'),
(2,'B','K');