Ошибка столбца T-SQL при попытке отфильтровать дубликаты - PullRequest
1 голос
/ 21 июля 2010

У меня есть следующие данные

COL-1     COL-2

1        0TY/OK
1        0TY/OK
1        0TY/OK 
1        0TY/OK 
1        0TY/OK
2        2KP/L         
2        2KP/L
2        2KP/L  
2        2KP/L       
2        2KP/L      
3        7U5/2M
3        7U5/2M 
3        7U5/2M 
3        7U5/2M

И я хочу создать запрос на выборку, чтобы получить эти данные в выводе ниже

COL-1     COL-2        COL-3

1        0TY/OK      0TY/OK
1        0TY/OK      2KP/L  
1        0TY/OK      7U5/2M
1        0TY/OK 
1        0TY/OK
2        2KP/L         
2        2KP/L
2        2KP/L  
2        2KP/L       
2        2KP/L      
3        7U5/2M
3        7U5/2M 
3        7U5/2M 
3        7U5/2M

Я хочу, чтобы COL3 возвращал различные значения COL2

Использование SELECT COL1, COL2, DISTINCT COL2 AS COL3 FROM MYTable не работает - SQL SERVER

Ответы [ 4 ]

1 голос
/ 21 июля 2010

Это действительно необычно, и я не могу понять, почему вы хотите это в одном наборе результатов, поскольку это не имеет никакого смысла ... Нет причин связывать строки отдельного запроса со строками в-dininct query., но вам нужно просто выполнить оба запроса

Select Col1, Col2 From Table
Order By Col1, Col2

и

Select Distinct Col2 From Table

и объединить их вместе (Чтобы объединить их по номеру строки, добавьте Row_Number() функция для каждого запроса:

   Select Col1, Col2, Col3
   From   (Select Row_Number() Over(Order By Col1, Col2)RowNum, 
               Col1, Col2 
           From Table) T1
     Left Join 
          (Select Distinct Col2 As Col3,
           (Select Count(Distinct Col2)
            From Table
            Where Col2 <= T2.Col3) RowNum                    
           From Table) T2
        On T2.RowNum = T1.RowNum
1 голос
/ 21 июля 2010

Хотя я уверен, что какой-нибудь мастер SQL сможет создать способ сделать это, я чувствую необходимость указать, что концептуально это не имеет смысла - значения в строках столбца 3 совершенно не связаны к значениям строк в столбцах 1 и 2.

Разве вы не можете просто вернуть отдельные значения COL2 в отдельном запросе?

SELECT DISTINCT COL2 FROM MyTable

(Обратите внимание, что вы можете вернуть несколько наборов результатов из одного запроса SQL)

0 голосов
/ 21 июля 2010

Попробуйте это ..

WITH MyTable AS
(
    SELECT 1 Col1,CONVERT (VarChar (25), '0TY/OK') Col2 UNION ALL
    SELECT 1,'0TY/OK' UNION ALL
    SELECT 1,'0TY/OK' UNION ALL
    SELECT 1,'0TY/OK' UNION ALL
    SELECT 1,'0TY/OK' UNION ALL
    SELECT 2,'2KP/L' UNION ALL
    SELECT 2,'2KP/L' UNION ALL
    SELECT 2,'2KP/L' UNION ALL
    SELECT 2,'2KP/L' UNION ALL
    SELECT 2,'2KP/L' UNION ALL
    SELECT 3,'7U5/2M' UNION ALL
    SELECT 3,'7U5/2M' UNION ALL
    SELECT 3,'7U5/2M' UNION ALL
    SELECT 3,'7U5/2M'
)
,
AllData AS
(
    SELECT 
        *, 
        ROW_NUMBER () OVER (ORDER BY Col2) as Id
    FROM MyTable
)
,
DistinctData AS
(
        SELECT 
            Distinct Col2 AS Col3
        FROM MyTable
),
DistinctWithRowNumber AS
(
    SELECT 
        *, 
        ROW_NUMBER () OVER (ORDER BY Col3) as Id
    FROM DistinctData
)
SELECT 
    Col1, 
    Col2, 
    Col3
FROM AllData
    LEFT JOIN DistinctWithRowNumber 
        ON AllData.Id = DistinctWithRowNumber.Id

возвращает этот результат

Col1        Col2                      Col3
----------- ------------------------- -------------------------
1           0TY/OK                    0TY/OK
1           0TY/OK                    2KP/L
1           0TY/OK                    7U5/2M
1           0TY/OK                    NULL
1           0TY/OK                    NULL
2           2KP/L                     NULL
2           2KP/L                     NULL
2           2KP/L                     NULL
2           2KP/L                     NULL
2           2KP/L                     NULL
3           7U5/2M                    NULL
3           7U5/2M                    NULL
3           7U5/2M                    NULL
3           7U5/2M                    NULL
0 голосов
/ 21 июля 2010

Вы можете использовать CTE для создания ROW_NUMBER и JOIN над этими виртуальными столбцами.

DECLARE @t TABLE (
   Col1 INT
   ,Col2 VARCHAR(10)
);

INSERT INTO @t VALUES (1, '0TY/OK');
INSERT INTO @t VALUES (1, '0TY/OK');
INSERT INTO @t VALUES (1, '0TY/OK');
INSERT INTO @t VALUES (1, '0TY/OK');
INSERT INTO @t VALUES (1, '0TY/OK');
INSERT INTO @t VALUES (2, '2KP/L,');
INSERT INTO @t VALUES (2, '2KP/L');
INSERT INTO @t VALUES (2, '2KP/L');
INSERT INTO @t VALUES (2, '2KP/L');
INSERT INTO @t VALUES (2, '2KP/L');
INSERT INTO @t VALUES (3, '7U5/2M');
INSERT INTO @t VALUES (3, '7U5/2M');
INSERT INTO @t VALUES (3, '7U5/2M');
INSERT INTO @t VALUES (3, '7U5/2M');

; WITH all_data AS (
   SELECT
      Col1
      ,Col2
      ,ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS RowNum
   FROM @t
),
distinct_data AS (
   SELECT
      Col2
      ,ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS RowNum
   FROM @t
   GROUP BY
      Col2
)
SELECT
   all_data.Col1
   ,all_data.Col2
   ,distinct_data.Col2
FROM all_data
   LEFT JOIN distinct_data ON all_data.RowNum = distinct_data.RowNum
...