Раздел SQL по столбцам IN listOfColumnNames - PullRequest
0 голосов
/ 24 апреля 2018

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

select COLUMN_NAME as cl from information_schema.columns where table_name = 'TEST'

Затем я хотел бы выполнить следующий запрос.

SELECT *,
ROW_NUMBER() OVER(PARTITION BY Cols IN cl ORDER BY (SELECT 0)) AS rn
FROM TEST 

Второй запрос работает хорошо, если я вручную укажуимена столбцов для раздела.Но в противном случае это не удается.Есть ли способ сделать это?Мотивация всего этого заключается в том, что у меня есть таблица без идентификатора, где могут быть дубликаты строк, от которых я хочу избавиться.Второй запрос основан на ответах на этот вопрос.Я использую MS SQL 2008.

Пример данных до:

| Column1 | Column2 |  Column3   |
|---------|---------|------------|
| aaaa    |    1111 | 23.04.2018 |
| bbbb    |    2222 | 24.04.2018 |
| cccc    |    3333 | 25.04.2018 |
| dddd    |    4444 | 26.04.2018 |
| bbbb    |    4445 | 27.04.2018 |
| aaaa    |    1111 | 23.04.2018 |
| aaaa    |    1234 | 23.04.2018 |

Пример данных после:

| Column1 | Column2 |  Column3   |
|---------|---------|------------|
| aaaa    |    1111 | 23.04.2018 |
| bbbb    |    2222 | 24.04.2018 |
| cccc    |    3333 | 25.04.2018 |
| dddd    |    4444 | 26.04.2018 |
| bbbb    |    4445 | 27.04.2018 |
| aaaa    |    1234 | 23.04.2018 |

Ответы [ 2 ]

0 голосов
/ 24 апреля 2018

В вашем случае достаточно DISTINCT.

SELECT DISTINCT Column1, Column2, Column3
FROM TEST

Если у вас есть другие значения в столбце 3, вы напишите что-нибудь ниже:

SELECT Column1, Column2, Column3
FROM(
    SELECT *,
         ROW_NUMBER() OVER(PARTITION BY Col1,Col2 ORDER BY Column3) AS RN
    FROM TEST
    )D
WHERE RN=1
0 голосов
/ 24 апреля 2018

Вы можете определить вторую таблицу и вставить простую SELECT DISTINCT *. Попробуйте:

Подсказка: я использую объявленные здесь переменные таблиц, но для этого вам понадобятся реальные таблицы.

SET DATEFORMAT DMY;

DECLARE @tbl TABLE(Column1 VARCHAR(100),Column2 INT,Column3 DATE)
INSERT INTO @tbl VALUES
 ('aaaa',1111,'23.04.2018')
,('bbbb',2222,'24.04.2018')
,('cccc',3333,'25.04.2018')
,('dddd',4444,'26.04.2018')
,('bbbb',4445,'27.04.2018')
,('aaaa',1111,'23.04.2018')
,('aaaa',1234,'23.04.2018');

--define a new table with the same structure
--Make sure, that the column order is absolutely the same as the origin!
DECLARE @tbl2 TABLE(Column1 VARCHAR(100),Column2 INT,Column3 DATE)

INSERT INTO @tbl2
SELECT DISTINCT * FROM @tbl;

--Check the result
SELECT * FROM @tbl2;

В качестве альтернативы вы можете использовать этот синтаксис для создания физической таблицы на лету

SELECT DISTINCT * INTO dbo.NewTable FROM @tbl;

Внимание : Не использовать форматы даты, зависящие от культуры ...

...