Проблема столбца T-SQL Distinct при попытке фильтровать дубликаты

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

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

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

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-СЕРВЕР

1
задан StackTrace 21 July 2010 в 13:19
поделиться

4 ответа

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

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

SELECT DISTINCT COL2 FROM MyTable

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

1
ответ дан 2 September 2019 в 22:52
поделиться

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

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
ответ дан 2 September 2019 в 22:52
поделиться

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

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
ответ дан 2 September 2019 в 22:52
поделиться

Вы можете использовать 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
0
ответ дан 2 September 2019 в 22:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: