sql >> データベース >  >> RDS >> Sqlserver

SQL Server 2008 の group_concat

    バージョン 2005 以降の SQL Server では、ROW_NUMBER で CTE (Common Table Expression) を使用できます。 重複を排除する機能:

    ;WITH LastPerUser AS
    (
       SELECT 
           ID, UserID, ClassID, SchoolID, Created,
           ROW_NUMBER() OVER(PARTITION BY UserID ORDER BY Created DESC) AS 'RowNum'
       FROM dbo.YourTable
    )
    SELECT 
       ID, UserID, ClassID, SchoolID, Created,
    FROM LastPerUser
    WHERE RowNum = 1
      

    この CTE は、データを UserID で「分割」します。 、および各パーティションの ROW_NUMBER 関数は、1 から始まり、Created DESC の順に並べられた連番を渡します。 - したがって、最新の行は RowNum = 1 になります。 (各 UserID ごとに ) これは、その後の SELECT ステートメントで CTE から選択したものです。

    同じ CTE を使用して、重複を簡単に削除することもできます:

    ;WITH LastPerUser AS
    (
       SELECT 
           ID, UserID, ClassID, SchoolID, Created,
           ROW_NUMBER() OVER(PARTITION BY UserID ORDER BY Created DESC) AS 'RowNum'
       FROM dbo.YourTable
    )
    DELETE FROM dbo.YourTable t
    FROM LastPerUser cte
    WHERE t.ID = cte.ID AND cte.RowNum > 1
      

    同じ原則が適用されます:いくつかの基準でデータを「グループ化」(またはパーティション化) し、各データ パーティションのすべての行に連続番号を付け、「パーティション化された行番号」の値が 1 より大きい行は DELETE .



    1. ajax呼び出しが多すぎるためにブラウザでメモリ不足エラーが発生しないようにする方法

    2. ロギングのために SQL Server の log4net 構成内でストアド プロシージャを使用する方法

    3. SQL Server の計算列は EntityFramework でどのように機能しますか?

    4. Eloquent ORM/laravelを使用したプリペアドステートメント