首先是SQL查询计数和标签

时间:2013-03-12 19:10:02

标签: sql count unique record

我正在使用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部分。

1 个答案:

答案 0 :(得分: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