如何获取上一行文本

时间:2014-08-25 12:11:51

标签: sql sql-server-2008 row

首先:我是SQL初学者,我使用的是SQL Server 2008。

现在的表格写成:

SELECT 
    Transaction.description, Person.name 
FROM 
    Transaction, Person, SystemUser
WHERE 
    Person.personnumber = SystemUser.personnumber 
    AND Transaction.art_ID = SystemUser.art_ID 
ORDER BY 
    Transaction.description

其中personnumber是PK nvarchar(可能看起来像N0890),其中最后一个数字为每个新人增加+1。

art_ID(交易)为PK smallintart_ID(SystemUser)为smallintdescriptionnvarchar

我想从同一列的前一行获取文本,这样我就可以操作文本清晰,使结果表看起来更简单。

现在的例子:

|Transactions       | Persons  |
|-------------------|----------|
|Statistic          | Ursula   |
|Statistic          | Peter    |
|Statistic          | Alan     |
|Settlement         | Christie |
|Settlement         | Tania    |
|Deptor department  | Jack     |
|Economy department | Rickie   |
|Economy department | Annie    |
|Economy department | Tom      |
|Economy department | Seth     |

我希望如何:

|Transactions       | Persons  |
|-------------------|----------|
|Statistic          | Ursula   |
|                   | Peter    |
|                   | Alan     |
|Settlement         | Christie |
|                   | Tania    |
|Deptor department  | Jack     |
|Economy department | Rickie   |
|                   | Annie    |
|                   | Tom      |
|                   | Seth     |

如同在描述=描述时的选择情况 - 然后是''

我搜索了一些示例,其中每个示例都基于整数,而不是varchar / nvarchar),当我尝试使用varchars时,我一直遇到错误。例如使用CTE,min()和max()。

您是否了解我可以使用哪些功能或如何设置select-statement来按我的意愿执行?

2 个答案:

答案 0 :(得分:0)

首先使用排名函数来识别其中一个:

SELECT Transaction.description, Person.name,
RANK() OVER (PARTITION BY Transaction.description ORDER BY Person.name) As R
FROM Transaction, Person, SystemUser
WHERE Person.personnumber = SystemUser.personnumber 
AND Transaction.art_ID = SystemUser.art_ID 
ORDER BY Transaction.description, Person.name

请注意,您要查看的行对其有1个?使用:

SELECT 
CASE WHEN R=1 THEN Transaction.description ELSE '' END description, 
Person.name
FROM 
(
SELECT Transaction.description, Person.name,
RANK() OVER (PARTITION BY Transaction.description ORDER BY Person.name) As R
FROM Transaction, Person, SystemUser
WHERE Person.personnumber = SystemUser.personnumber 
AND Transaction.art_ID = SystemUser.art_ID 
) Subtable
ORDER BY Transaction.description,  Person.name   

答案 1 :(得分:0)

我认为遵循SQL应该可行

CREATE TABLE #TempTable (rowrank INT, description VARCHAR(256), name VARCHAR(256));

INSERT INTO #TempTable (rowrank, description, name)
VALUES

Select RANK() OVER (ORDER BY Transaction.description)
    ,Transaction.description
    ,name
FROM Transaction, Person, SystemUser
WHERE Person.personnumber = SystemUser.personnumber 
AND Transaction.art_ID = SystemUser.art_ID 
ORDER BY Transaction.description

SELECT 
CASE 
    WHEN prev.RANK = TT.RANK
        THEN ""
    ELSE TT.Description 
END AS Description,
name 

FROM #TempTable TT
LEFT JOIN #TempTable prev ON prev.rownum = TT.rownum - 1