0

SQL Server Management 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 に答える