我想根据表中给定行的次数来编号我的表的所有行。我尝试按如下方式定义列的表:
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 |
答案 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