2015-05-20 5 views
0

Я пытаюсь создать столбец в SQL SERVER, который показывает 1 ИЛИ 0 (ноль). У меня есть столбец с номерами клиентов, которые появляются более одного раза. При первом попадании на уникальный номер, не повторяющийся клиент, он должен показывать один, а если он повторяется, то 0 (ноль). Как я могу создать это?Создание уникального столбца идентификатора (1 или ноль) Ранг() SQL SERVER

CustNumber Unique 
25122134  1 
25122134  0 
25122134  0 
25122136  1 
25122136  0 

Решения, которые я рассматриваю и проверяю сейчас, - это Rank() и Rank_DENSE().

ответ

2
declare @test table 
(
    CustNumber int 
) 

insert into @test values 
(25122134), 
(25122134), 
(25122134), 
(25122136), 
(25122136) 

select 
    * , 
    // each CustNumber in partition has the same rank, but different row_number 
    case when (row_number() over (partition by CustNumber order by CustNumber)) = 1 
     then 1 else 0 end as [Unique]   
     // the 1st is unique, the rest (2..n) are not 
from @test  
order by CustNumber, [Unique] desc 
// unique in each group should be displayed first 
+0

Благодарим Вас за предоставление решения я не знаю, что вы могли бы сделать это: случай, когда (row_number() над (раздел по заказу CustNumber по CustNumber)) = 1 Я думал, что вам нужно было сделать это в конце скобки, сказав WHERE row = 1. Спасибо! Узнал что-то новое :) –

2

Вы не хотите RANK потому, что, по определению, производит тот же результат для одинаковых входных данных.

ROW_NUMBER() и простое CASE выражение должно сделать это:

;WITH Numbered as (
    SELECT CustNumber, 
     ROW_NUMBER() OVER (PARTITION BY CustNumber 
          ORDER BY CustNumber) as rn --Unusual - pick a real column if you have a preference 
    FROM YourUnnamedTable 
) 
SELECT CustNumber,CASE WHEN rn = 1 THEN 1 ELSE 0 END as [Unique] 
FROM Numbered 
+0

Очень интересное решение для меня как новичка. Можно ли все это использовать в одном запросе? Что-то вроде CASE WHEN Row_Number() OVER (PARTITION BY Customer) = 1 THEN 1 ELSE 0 –

+0

Это единственный запрос - [CTE] (https://technet.microsoft.com/en-us/library/ms190766%28v = sql.105% 29.aspx) ('Numbered', здесь) - это просто способ отделить часть логики, чтобы мне не пришлось повторять что-то. Пока [ответ ASH] (http://stackoverflow.com/a/30342185/15498) также не повторяет (в настоящее время) вещи, это должно было бы, если бы вы хотели сделать больше с результатами ROW_NUMBER(). –

+0

Спасибо. Я многое узнал из понимания вашего кода. Он расширил мой репертуар, чтобы решить больше вещей в SQL SERVER вместо того, чтобы вынимать данные и решать их в excel. Спасибо! –

Смежные вопросы