让我们来:
SELECT Name, Surname, Salary, TaxPercentage
FROM Employees
返回:
Name |Surname |Salary |TaxPercentage
--------------------------------------
Moosa | Jacobs | $14000 | 13.5
Temba | Martins | $15000 | 13.5
Jack | Hendricks | $14000 | 13.5
我希望它返回:
Name |Surname | Salary |TaxPercentage
-------------------------------------------
Moosa | Jacobs | $14000 | NULL
Temba | Martins | $15000 | NULL
Jack | Hendricks| $14000 | 13.5
由于TaxPercentage的值重复出现,我希望它最后只出现一次。
答案 0 :(得分:7)
在sql server 2012及更高版本中,您可以使用Lead
窗口函数来获取下一行的值。假设您有某种方法对数据进行排序(如标识列),您可以利用此优势:
SELECT Name,
Surname,
Salary,
CASE WHEN TaxPercentage = LEAD(TaxPercentage) OVER (ORDER BY Id) THEN
NULL
ELSE
TaxPercentage
END As TaxPercentage
FROM Employees
ORDER BY Id
请参阅fiddle(感谢Lasse V. Karlsen)
答案 1 :(得分:1)
如果由于某种原因您无法使用LEAD()
,那么这应该有效:
with T as (
SELECT
Name, Surname, Salary, TaxPercentage,
row_number() over (order by TaxPercentage /* ??? */) as rn
FROM Employees
)
select
Name, Surname, Salary,
nullif(
TaxPercentage,
(select t2.rn from T as t2 where t2.rn = t.rn + 1)
) as TaxPercentage
from T as t
答案 2 :(得分:1)
你应该有办法按顺序订购数据。在我的示例中,我使用简单的IDENTITY
列,在您的列中可能是主键或日期:
DECLARE @DataSource TABLE
(
[Name] VARCHAR(12)
,[Surname] VARCHAR(12)
,[Salary] VARCHAR(12)
,[TaxPercentage] DECIMAL(9,1)
--
,[RowID] TINYINT IDENTITY(1,1)
);
INSERT INTO @DataSource ([Name], [Surname], [Salary], [TaxPercentage])
VALUES ('Moosa', 'Jacobs', '$14000', '13.5')
,('Temba', 'Martins', '$15000', '13.5')
,('Jack', ' Hendricks', '$14000', '13.5')
,('Temba', 'Martins', '$15000', '1.5')
,('Jack', ' Hendricks', '$14000', '1.5')
,('Temba', 'Martins', '$15000', '23')
,('Jack', ' Hendricks', '$14000', '7')
,('Temba', 'Martins', '$15000', '7')
,('Jack', ' Hendricks', '$14000', '7')
SELECT [Name]
,[Surname]
,[Salary]
,[TaxPercentage]
,NULLIF([TaxPercentage], LEAD([TaxPercentage], 1, NULL) OVER (ORDER BY [RowID])) AS [NewTaxPercentage]
FROM @DataSource;
答案 3 :(得分:1)
我需要一个列来对像Id这样的行进行排序
;with cte as (
SELECT
Id, Name, Surname, Salary, TaxPercentage,
LEAD(TaxPercentage, 1, NULL) OVER (ORDER BY Id) AS NextValue
FROM Employees
)
select
Id, Name, Surname, Salary,-- TaxPercentage,
TaxPercentage = CASE WHEN TaxPercentage = NextValue THEN NULL ELSE TaxPercentage END
from cte
请查看SQL Lag()和Lead() functions,了解有关这些新分析功能的详细信息
答案 4 :(得分:0)
如果需要,使用SQL Server> = 2008 http://sqlfiddle.com/#!3/ec020/1/0
Select o.Name, o.Surname, o.Salary
, TaxPercentage = case when o.id = 1 then o.TaxPercentage else null end
From (
Select Name, Surname, Salary, TaxPercentage
, id = row_number() over(partition by TaxPercentage order by Name, surname, Salary) -- update order...
From Employees as e
) as o
order by o.TaxPercentage, o.id desc