0

我正在使用 SQL Server 管理 Studio 2010。

如果记录包含第一次出现的值,我需要我的查询来填充列。

我的查询返回的表很大,所以我将使用假装列来表达我的观点。我的查询当前返回一个看起来像这样的表

| ROW | ItemNumber | DateOpen | Status |
|  1  |      10045 | 5/5/2005 |   Open |
|  2  |      10045 | 5/5/2005 |   Open |
|  3  |      10046 | 5/5/2005 |   Open |
|  4  |      10046 | 5/5/2005 |   Open |
|  5  |      10046 | 5/5/2005 |   Open |

我已经将行指示符添加到查询中,认为这将有助于识别第一次出现的 ItemNumber。如果记录是第一次出现,我需要有一个标记 X 的新列。

到目前为止我有这个

    DECLARE @ItemData Table(itemRow BIGINT, itemNumber BIGINT, DateOpen VARCHAR(15), status VARCHAR(15))
INSERT INTO @ItemData (itemRow, ItemNumber, DateOpen, Status)
SELECT Row_Number() OVER(ORDER BY Cm_ItemNumber) AS 'ROW'
       ,Cm_ItemNumber                            AS ItemNumber
       ,Dates_DateOpen                           AS DateOpen
       ,St_Status                                AS Status
FROM db_Items
JOIN db_Dates ON Dates_Item = Cm_ItemID
JOIN db_Status ON St_ID = Cm_StatusID
Select * from @ItemData

将其放入表中然后单独选择的原因是因为查询中实际上有一个联合和更多内容,当我意识到我需要做一个唯一的检查器并将其添加到列中时,我认为最简单的方法是“事后”类型的东西,它会进入该 Select * from @ItemData部分。

4

1 回答 1

1

我没有对此进行测试,但它与我将要玩的路线一致......
使用您现有的查询作为 2 个 CTE 中的第一个:

With AllData as
(
SELECT Row_Number() OVER(ORDER BY Cm_ItemNumber) AS 'ROW'
       ,Cm_ItemNumber                            AS ItemNumber
       ,Dates_DateOpen                           AS DateOpen
       ,St_Status                                AS Status
FROM db_Items
JOIN db_Dates ON Dates_Item = Cm_ItemID
JOIN db_Status ON St_ID = Cm_StatusID
),
FirstRows as
(
SELECT Min(ROW) as Row, ItemNumber
FROM AllData 
GROUP BY ItemNumber
)
SELECT
  ad.*,
  Case When fr.Row IS NULL then '' else 'X' end as X_Col
FROM AllData ad LEFT JOIN FirstRows fr 
  ON ad.ROW=fr.Row
于 2013-03-12T20:08:07.343 回答