返回一列以通知另一列的行更改

时间:2017-07-25 15:23:09

标签: sql-server tsql

我有这张桌子:

|----fruit----|
|-------------|
|--Apples--|
|--Apples--|
|--Apples--|
|--Apples--|
|-bananas-|
|-bananas-|
|-oranges-|
|--plums---|
|--plums---|

我有以下脚本:

case when
[fruit] = [fruit] then '0'
else [fruit]
end

我想要做的是返回两列。 1是水果柱,第2个是柱子,显示水果柱何时变为下一个水果,所以我有以下内容: -

|----fruit----||fruit change|
|-------------||----------------|
|--Apples--||-------0-------|
|--Apples--||-------0-------|
|--Apples--||-------0-------|
|--Apples--||-------0-------|
|-bananas-||--bananas--|
|-bananas-||-------0-------|
|-oranges-||---oranges---|
|--plums---||----plums----|
|--plums---||-------0-------|
|--plums---||-------0-------|
|--plums---||-------0-------|
|--plums---||-------0-------|
|--mango---||---mango---|
|--mango---||-------0-------|

如何返回与水果变化相对应的列,因为上面的脚本不允许我指定我需要它做什么。

2 个答案:

答案 0 :(得分:1)

您可以使用以下延迟:

Select fruit,case when fruit <> lag(fruit) over(order by id) then fruit else '0' end as fruitChange 
    from #data

输出如下:

+---------+-------------+
|  fruit  | fruitChange |
+---------+-------------+
| Apples  | 0           |
| Apples  | 0           |
| Apples  | 0           |
| Apples  | 0           |
| bananas | bananas     |
| bananas | 0           |
| oranges | oranges     |
| plums   | plums       |
| plums   | 0           |
+---------+-------------+

答案 1 :(得分:0)

版本,第一行显示水果,而不是0。

-- create table 
create table #data (id int identity(1,1), fruit nvarchar(20))
go

-- insert 
insert into #data 
values ('apple'),('apple'),('apple'),('ban'),('ban'),('orange'),('orange'),('orange'),('orange'),('lime'),('lime'),('lime'),('lime'), ('steak')
go

-- select, note first row will give you fruit as well 
Select *,
    case when fruit <> lag(fruit) over(order by id) 
            or lag(fruit) over(order by id) is null then fruit
        else '0' 
    end as value
from #data

输出:

id  fruit   value
1   apple   apple
2   apple   0
3   apple   0
4   ban     ban
5   ban     0
6   orange  orange
7   orange  0
8   orange  0
9   orange  0
10  lime    lime
11  lime    0
12  lime    0
13  lime    0
14  steak   steak