按列INO ListOfColumnNames的SQL分区

时间:2018-04-24 11:21:20

标签: sql sql-server tsql duplicates

我想根据表中给定行的次数来编号我的表的所有行。我尝试按如下方式定义列的表:

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 

如果我手动指定分区的列名,第二个查询就可以正常工作。但否则就会失败。有办法做到这一点吗? 所有这一切背后的动机是我有一个没有ID的表,其中可能存在我想要删除的行重复。 第二个问题的灵感来自this问题的答案。 我使用的是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 :(得分:2)

您可以定义第二个表并插入一个简单的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;

注意:请勿使用与文化相关的日期格式...

答案 1 :(得分:0)

在你的情况下,DISTINCT就足够了。

SELECT DISTINCT Column1, Column2, Column3
FROM TEST

如果您在Column3中有任何不同的值,那么您可以在下面写一些内容:

SELECT Column1, Column2, Column3
FROM(
    SELECT *,
         ROW_NUMBER() OVER(PARTITION BY Col1,Col2 ORDER BY Column3) AS RN
    FROM TEST
    )D
WHERE RN=1