2016-05-04 2 views
2

это мой первый пост, и я надеюсь, что все будет ясно для вас. У меня есть таблица, такие как:Добавление значений на основе дублированных данных

client ; cost 
Paula ; 100 
Paula ; 50 
Jacob ; 300 
Paula ; 120 

Я хочу добавить еще один столбец «CLIENT2», где значение будет 1, если не были дубликатами или если было дублировать его следует 1 только для дубликата с самым большим стоимость, так:

client ; cost ; client2 
Paula ; 100 ; 0 
Paula ; 50 ; 0 
Jacob ; 40 ; 1 
Paula ; 120 ; 1 

В реальном столе есть 2000 записей. Как мне написать его в SQL Server? Спасибо заранее, Paula

+0

Что делать, если были дубликаты с одинаковой стоимостью .... была ли такая запись? – cableload

ответ

4
WITH CTE AS 
    (SELECT 
     client, 
     cost, 
     ROW_NUMBER() OVER (PARTITION BY client ORDER BY cost DESC) AS RowNo 
    FROM 
     table) 
SELECT 
    client, 
    cost, 
    CASE RowNo 
     WHEN 1 THEN 1 
     ELSE 0 
    END AS client2 
FROM 
    CTE; 
0

Вы можете сделать это с помощью cursor. Нижеприведенный пример должен обрабатывать то, что вы хотите. Вы должны заменить #table именем своей таблицы. Уродливый как грех, но он работает;)

CREATE TABLE #Table 
(
    client NVARCHAR(100), 
    cost int, 
    client1 int 
); 

INSERT INTO #Table 
VALUES 
('Paula',100,null), 
('Paula',50,null), 
('Jacob',300,null), 
('Paula',120,null); 

DECLARE @clientColumn nvarchar(100); 
DECLARE @Dup int; 

DECLARE client_cursor CURSOR FOR 
SELECT client,cost FROM #Table ORDER BY client,cost 

OPEN client_cursor; 
FETCH NEXT FROM client_cursor INTO @clientColumn 

WHILE @@FETCH_STATUS=0 
BEGIN 

set @dup = (SELECT TOP 1 cost FROM #Table WHERE client = @clientColumn GROUP BY client ORDER BY cost desc) 

UPDATE #Table 
SET 
    client1 = 1 
WHERE client = @clientColumn AND cost = @dup  

FETCH NEXT FROM client_cursor INTO @clientColumn 
END 
CLOSE client_cursor 
DEALLOCATE client_cursor; 

UPDATE #Table 
SET 
    client1 = 0 
    WHERE client1 IS NULL 

SELECT * FROM #Table 
Смежные вопросы