基于另一列值

时间:2015-11-12 03:06:06

标签: sql sql-server ms-access

这是我在这个网站上的第一个问题,我想知道,如果我在SQL中有这样一个表

  • a
  • a
  • 一个
  • 一个
  • 一个
  • B'/ LI>
  • B'/ LI>
  • B'/ LI>
  • C
  • C
  • 一个
  • 一个
  • B'/ LI>
  • B'/ LI>

如何在查询中生成序列号或ID的列表,使其根据值列更改,这就是我想要的:

  • 值; ID
  • 一个; 1
  • a; 1
  • a; 1
  • a; 1
  • a; 1
  • b; 2
  • b; 2
  • b; 2
  • c; 3
  • c; 3
  • a; 4
  • a; 4
  • b; 5
  • b; 5

感谢大家提前回答。

3 个答案:

答案 0 :(得分:0)

您可以通过一系列查询执行此操作。 1.从包含自动增量字段和文本字段的表开始,没有别的。没有记录。 2.根据您的值字段对您的表进行聚合查询。 3.编写一个追加查询,将步骤2中查询的记录追加到步骤1的表中。该查询的结果将是您想要的结果。

答案 1 :(得分:0)

Gordon Linoff对于没有订购是正确的,所以不可能完全按照你的要求去做 但是,如果在SQL Server中有一个要排序的附加列,则可以使用DENSE_RANK来分配数字:

--create table Test(col varchar(100))
--insert into Test values('a'),('a'),('a'),('b'),('b'),('c'),('d')

select col, DENSE_RANK() over (Order BY col)
from Test

它会产生

a 1
a 1
a 1
b 2
b 2
c 3
d 4

或者总是有一个循环或游标循环选项。这个脚本似乎产生了你的预期结果:

/*
    drop table Test
    create table Test(ExcelRowId int not null identity primary key, data varchar(100) not null, idx int)
    insert into Test(data) values('a'),('a'),('a'),('a'),('a'),('b'),('b'),('b'),('c'),('c'),('a'),('a'),('b'),('b')
*/

declare @idx int, @prev_data varchar(100), @data varchar(100)
set @idx = 0
declare cur cursor for select Data from Test order by ExcelRowId for update of idx
open cur
fetch next from cur into @data
while @@FETCH_STATUS = 0
begin
    if @prev_data is null or @data <> @prev_data set @idx = @idx + 1
    set @prev_data = @data

    update Test set Idx = @Idx WHERE CURRENT OF cur

    fetch next from cur into @data
end
close cur
deallocate cur

select * from test

答案 2 :(得分:0)

CREATE TABLE mytable(Id int, Value char(1))
INSERT INTO mytable
SELECT 1,'a'
UNION ALL
SELECT 2,'a'
UNION ALL
SELECT 3,'a'
UNION ALL
SELECT 4,'a'
UNION ALL
SELECT 5,'a'
UNION ALL
SELECT 6,'b'
UNION ALL
SELECT 7,'b'
UNION ALL
SELECT 8,'b'
UNION ALL
SELECT 9,'a'
UNION ALL
SELECT 10,'a'
UNION ALL
SELECT 11,'b'
UNION ALL
SELECT 12,'b'
UNION ALL
SELECT 13,'c'
UNION ALL
SELECT 14,'c';

WITH cte AS 
(SELECT 
    t1.Id
    ,t1.Value
    ,ROW_NUMBER() OVER (ORDER BY t1.Id) RowNo
FROM mytable t1
LEFT OUTER JOIN mytable t2 ON t1.Id = t2.Id - 1
WHERE 
    t2.id IS NULL
    OR t1.Value <> t2.Value)
SELECT 
mytable.Id
,mytable.Value
,MIN(cte.RowNo) RowNo
FROM
mytable
LEFT OUTER JOIN cte ON mytable.Value = cte.Value AND mytable.Id <= cte.Id
GROUP BY 
    mytable.Id
,mytable.Value
ORDER BY
mytable.id