Условный поиск групп дублированных пар столбцов, если одна из пар содержит определенный флаг.Затем обновить все до этого txId - PullRequest
0 голосов
/ 26 сентября 2019

Я новичок в SQL.В таблицу вставлены неверные данные.В таблице представлены товары, которые приобрел пользователь.txId - это идентификатор, сгенерированный при покупке.Предполагается, что каждая комбинация элемент / пользователь имеет одинаковый txId.

id | item   | user     | txId    | date (ms)
-----------------------------------------------
1  | cup    | bob      |   10    | 1000000
2  | cup    | bob      |   -1    | 1000000
3  | cup    | bob      |   10    | 1000000
4  | cup    | jim      |   -1    | 2000000
5  | hat    | bob      |   10    | 1000000
6  | pen    | tom      |   -1    | 3000000
7  | pen    | tom      |   -1    | 3000000
8  | pen    | tom      |   13    | 3000000
9  | shoe   | bob      |   10    | 1000000
10 | hat    | dan      |   -1    | 4000000
11 | hat    | dan      |   -1    | 4000000

Я пытаюсь найти все группы предметов / sku, у которых txId равен -1 И другой допустимый txId (который не равен -1).Меня не волнует строка 4, поскольку cup / jim - это всего лишь 1 строка элемента / пользователя.В строке 5/9 также имеется только 1 строка для элемента / группы пользователей.В строке 10/11 нет действительного идентификатора транзакции, поэтому я тоже не хочу их.

Я хочу, чтобы мои результаты были:

id | item   | user     | txId    | date (ms)
-----------------------------------------------
1  | cup    | bob      |   10    | 1000000
2  | cup    | bob      |   -1    | 1000000
3  | cup    | bob      |   10    | 1000000
6  | pen    | tom      |   -1    | 3000000
7  | pen    | tom      |   -1    | 3000000
8  | pen    | tom      |   13    | 3000000

Вот что я пробовал

select groups.id, groups.item, groups.user, groups.txId, groups.date
from ( 
    SELECT
    *
    FROM (
    SELECT
        *
        , COUNT(*) OVER (PARTITION BY item, user) AS occurrences
    FROM myTable tbl
    ) t
    WHERE t.occ > 1
) groups
INNER JOIN 
( 
    SELECT * FROM myTable WHERE txId = -1
) violators
ON violators.user = groups.user AND violators.item = groups.item
ORDER BY groups.user, groups.item DESC

Я получаю некоторые ложные срабатывания и не могу понять, почему,

1 Ответ

0 голосов
/ 26 сентября 2019

Вы можете использовать exists:

select t.*
from t
where (t.txid > 0 and
       exists (select 1
               from t t2
               where t2.item = t.item and t2.user = t.usr and
                     t2.txid < 0
              )
      ) or
      (t.txid < 0 and
       exists (select 1
               from t t2
               where t2.item = t.item and t2.user = t.usr and
                     t2.txid > 0
              )
      );

Вы также можете использовать функции окна:

select t.*
from (select t.*,
             min(txid) over (partition by item, user) as min_txid,
             max(txid) over (partition by item, user) as max_txid
      from t
     ) t
where min_txid = -1 and max_txid > 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...