7

以下は、SQL Server 2008 データベースにあるテーブルのサブセットです。

、連続した値の最大数Serial Number、および実際の数を出力しようとしています。表は値の降順で並べられていることに注意してください(この条件は重要です)。昇順または降順でグループ化または順序付けできます...より効率的で理にかなっています。 LIDLIDLast Updated DateSerial NumberSerial Number

データは次のようになります。

[Serial Number]  [LID]   [Last Updated Date]
--------------------------------------    
123456            AAA     2012-09-24
123456            AAA     2012-09-23
123456            AAA     2012-09-22
123456            AAA     2012-09-21
123456            BBB     2012-09-20
123456            BBB     2012-09-19
123456            AAA     2012-09-18
123456            AAA     2012-09-17
123456            AAA     2012-09-16
234567            BBB     2012-09-24
234567            BBB     2012-09-23
234567            AAA     2012-09-22

テーブルへの望ましい出力は次のとおりです。

[Serial Number]     [LID]     [LID Count]
-------------------------------------------    
123456            AAA     4
234567            BBB     2

私は途方に暮れています。使ってみました

ROW_NUMBER() OVER(PARTITION BY [Service Tag], [LID]
                  ORDER BY [Last Updated Date] DESC) 

しかし、日付の降順を分解するだけで、日付の範囲内で最も多く発生するカウントと LID が得られます。

ご提供いただけるご支援をよろしくお願いいたします。

よろしくお願いします、

VP

4

2 に答える 2

4

以下の例を見てください

SQL フィドルのデモ

DECLARE @Table TABLE(
        [Serial Number] INT,
        [LID] VARCHAR(50),
        [Last Updated Date] DATETIME
)

INSERT INTO @Table SELECT 123456,'AAA','2012-09-24'
INSERT INTO @Table SELECT 123456,'AAA','2012-09-23'
INSERT INTO @Table SELECT 123456,'AAA','2012-09-22'
INSERT INTO @Table SELECT 123456,'AAA','2012-09-21'
INSERT INTO @Table SELECT 123456,'BBB','2012-09-20'
INSERT INTO @Table SELECT 123456,'BBB','2012-09-19'
INSERT INTO @Table SELECT 123456,'AAA','2012-09-18'
INSERT INTO @Table SELECT 123456,'AAA','2012-09-17'
INSERT INTO @Table SELECT 123456,'AAA','2012-09-16'
INSERT INTO @Table SELECT 234567,'BBB','2012-09-24'
INSERT INTO @Table SELECT 234567,'BBB','2012-09-23'
INSERT INTO @Table SELECT 234567,'AAA','2012-09-22'

;WITH Vals AS (
        SELECT  *,
                ROW_NUMBER() OVER(ORDER BY [Serial Number],[Last Updated Date] DESC) ROWID
        FROM    @Table
)
, ValsNext AS (
        SELECT  v.[Serial Number],
                v.LID,
                v.[Last Updated Date],
                v.ROWID,
                MIN(vn.ROWID) NextRowID
        FROM    Vals v LEFT JOIN
                Vals vN ON  v.[Serial Number] = vn.[Serial Number]
                        AND v.LID != vn.LID
                        AND v.ROWID < vn.ROWID
        GROUP BY    v.[Serial Number],
                    v.LID,
                    v.[Last Updated Date],
                    v.ROWID
)
, ValDiffs AS (
        SELECT  vn.[Serial Number],
                vn.LID,
                vn. NextRowID - vn.ROWID Consecutive
        FROM    ValsNext vn
)
, Serials AS (
        SELECT  [Serial Number],
                MAX(Consecutive) MaxConsecutive
        FROM    ValDiffs
        GROUP BY    [Serial Number]
)
SELECT  vd.*
FROM    Serials s INNER JOIN
        ValDiffs vd ON  s.[Serial Number] = vd.[Serial Number]
                    AND s.MaxConsecutive = vd.Consecutive
于 2012-09-27T04:29:13.803 に答える
0

ここに解決策があります

;with cte as (
  select sn, lid, ludate,
    datediff(d,row_number() over (
    partition by sn,lid
    order by ludate),ludate) dd
  from xtable
), cte2 as (
  select sn,lid,dd,count(*)c,
      rn=row_number() over (partition by lid
                            order by count(*) desc)
  from cte
  group by sn,lid,dd
)
select sn [Serial Number], lid, c [Count]
from cte2
where rn=1

最初の CTE は、複雑な DATEADD 式を使用して、列を使用してタグ付けされた連続する日をグループ化しますdd
2 番目の CTE は、カウントの通常の行番号です。

于 2012-09-27T04:48:23.627 に答える