обновлять дубликаты условно в Oracle / SQL - PullRequest
0 голосов
/ 03 февраля 2012

Мне нужно обновить повторяющееся значение в оплаченном столбце, если какой-либо подпункт помечен как оплаченный; затем обновите другой саб с тем же клиентом

Вот пример данных:

DATE    Event_ID    EVENT   CUSTOMER    SUBSCRIBER  Paid
01/24/2011  3513709 Play 1  41285030    38803277    Y
01/24/2011  3513709 Play 1  41285030    45051523    N
01/24/2011  3513709 Play 1  41285030    45051523    Y
01/25/2011  3527194 Play 2  45568242    43673464    Y
01/25/2011  3527194 Play 2  45568242    45023437    N
02/03/2011  3622935 Play 3  19356414    43546915    Y
02/03/2011  3622935 Play 3  19356414    44981229    N
02/07/2011  3674946 Play 4  41240152    38744274    Y
02/07/2011  3674946 Play 4  41240152    44225340    Y
02/07/2011  3674946 Play 4  41240152    44820829    N
03/10/2011  4094832 Play 5  31485304    33260562    Y
03/10/2011  4094832 Play 5  31485304    43922788    Y
03/10/2011  4094832 Play 5  31485304    45022503    N
03/10/2011  4094832 Play 5  31485304    45022503    Y
03/10/2011  4094833 Play 6  31485304    33260562    N
03/10/2011  4094833 Play 6  31485304    43922788    N
03/10/2011  4094833 Play 6  31485304    45022503    N
03/16/2011  4167371 Play 7  19384295    32940366    Y
03/16/2011  4167371 Play 7  19384295    45002390    N
03/17/2011  4179070 Play 8  36882841    38554357    Y
03/17/2011  4179070 Play 8  36882841    44988521    N

Желаемый результат должен быть таким:

DATE    Event_ID    EVENT   CUSTOMER    SUBS    Paid
01/24/2011  3513709 Play 1  41285030    38803277    Y
01/24/2011  3513709 Play 1  41285030    45051523    Y
01/24/2011  3513709 Play 1  41285030    45051523    Y
01/25/2011  3527194 Play 2  45568242    43673464    Y
01/25/2011  3527194 Play 2  45568242    45023437    Y
02/03/2011  3622935 Play 3  19356414    43546915    Y
02/03/2011  3622935 Play 3  19356414    44981229    Y
02/07/2011  3674946 Play 4  41240152    38744274    Y
02/07/2011  3674946 Play 4  41240152    44225340    Y
02/07/2011  3674946 Play 4  41240152    44820829    Y
03/10/2011  4094832 Play 5  31485304    33260562    Y
03/10/2011  4094832 Play 5  31485304    43922788    Y
03/10/2011  4094832 Play 5  31485304    45022503    Y
03/10/2011  4094832 Play 5  31485304    45022503    Y
03/10/2011  4094833 Play 6  31485304    33260562    N
03/10/2011  4094833 Play 6  31485304    43922788    N
03/10/2011  4094833 Play 6  31485304    45022503    N
03/16/2011  4167371 Play 7  19384295    32940366    Y
03/16/2011  4167371 Play 7  19384295    45002390    Y
03/17/2011  4179070 Play 8  36882841    38554357    Y
03/17/2011  4179070 Play 8  36882841    44988521    Y

Ответы [ 3 ]

1 голос
/ 03 февраля 2012

Суть этого в

  • Создайте подвыбор со всеми клиентами, у которых есть платная подписка
  • JOIN этот подпункт обратно с вашей фактической таблицей на предоставленных клиентов
  • Используйте этот результат в предложении UPDATE
  • Обновлять только там, где оплачено N

Оператор SQL

UPDATE  YourTable
SET     Paid = 'Y'
FROM    YourTable t
        INNER JOIN (
            SELECT  Customer
            FROM    YourTable
            WHERE   Paid = 'y'
        ) c ON c.Customer = t.Customer
WHERE   Paid = 'N'
0 голосов
/ 03 февраля 2012
WITH CTE AS (
    SELECT [Event], [Customer], SUM(CASE Paid WHEN 'Y' THEN 1 ELSE 0 END) [Sum]
    FROM tmpTbl
    GROUP BY [EVENT], Customer)

UPDATE tmpTbl SET [Paid] = 'Y'
FROM tmpTbl JOIN CTE AS tbl ON tmpTbl.[Event] = tbl.[Event] AND tmpTbl.[Customer] = tbl.[Customer] AND tbl.[Sum] > 0

Пример сценария данных

SELECT * INTO tmpTbl FROM (
SELECT GETDATE() -1 [DATE] ,3513709 [Event_ID],'Play 1' [Event],41285030 [CUSTOMER],38803277 [SUBSCRIBER],'Y' [PAID] UNION
SELECT GETDATE() -1 [DATE] ,3513709 [Event_ID],'Play 1' [Event],41285030 [CUSTOMER],45051523 [SUBSCRIBER],'N' [PAID] UNION
SELECT GETDATE() -1 [DATE] ,3513709 [Event_ID],'Play 1' [Event],41285030 [CUSTOMER],45051523 [SUBSCRIBER],'Y' [PAID] UNION

SELECT GETDATE() -2 [DATE] ,3527194 [Event_ID],'Play 2' [Event],45568242 [CUSTOMER],43673464 [SUBSCRIBER],'Y' [PAID] UNION
SELECT GETDATE() -2 [DATE] ,3527194 [Event_ID],'Play 2' [Event],45568242 [CUSTOMER],45023437 [SUBSCRIBER],'N' [PAID] UNION

SELECT GETDATE() -3 [DATE] ,4094832 [Event_ID],'Play 5' [Event],31485304 [CUSTOMER],43922788 [SUBSCRIBER],'Y' [PAID] UNION
SELECT GETDATE() -3 [DATE] ,4094832 [Event_ID],'Play 5' [Event],31485304 [CUSTOMER],45022503 [SUBSCRIBER],'Y' [PAID] UNION
SELECT GETDATE() -3 [DATE] ,4094832 [Event_ID],'Play 5' [Event],31485304 [CUSTOMER],45022503 [SUBSCRIBER],'N' [PAID] UNION
SELECT GETDATE() -3 [DATE] ,4094832 [Event_ID],'Play 5' [Event],31485304 [CUSTOMER],33260562 [SUBSCRIBER],'Y' [PAID] UNION
SELECT GETDATE() -3 [DATE] ,4094833 [Event_ID],'Play 6' [Event],31485304 [CUSTOMER],43922788 [SUBSCRIBER],'N' [PAID] UNION
SELECT GETDATE() -3 [DATE] ,4094833 [Event_ID],'Play 6' [Event],31485304 [CUSTOMER],33260562 [SUBSCRIBER],'N' [PAID] UNION
SELECT GETDATE() -3 [DATE] ,4094833 [Event_ID],'Play 6' [Event],31485304 [CUSTOMER],45022503 [SUBSCRIBER],'N' [PAID]) as tbl

Вывод

DATE    Event_ID    EVENT   CUSTOMER    SUBS    Paid
02/01/2012  3513709 Play 1  41285030    38803277    Y
02/01/2012  3513709 Play 1  41285030    45051523    Y
02/01/2012  3513709 Play 1  41285030    45051523    Y
01/31/2012  3527194 Play 2  45568242    43673464    Y
01/31/2012  3527194 Play 2  45568242    45023437    Y
01/30/2012  4094832 Play 5  31485304    33260562    Y
01/30/2012  4094832 Play 5  31485304    43922788    Y
01/30/2012  4094832 Play 5  31485304    45022503    Y
01/30/2012  4094832 Play 5  31485304    45022503    Y
01/30/2012  4094833 Play 6  31485304    33260562    N
01/30/2012  4094833 Play 6  31485304    43922788    N
01/30/2012  4094833 Play 6  31485304    45022503    N
0 голосов
/ 03 февраля 2012

Самый простой способ сделать это с помощью наивного подзапроса:

update events set paid = 'Y' where event_id in (
    select event_id from events where paid = 'Y'
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...