0

次のクエリがあります

SELECT  Cod ,
        MIN(Id) AS id_Min,
        -- retrieve value min in the middle as id_Min_Middle,
        -- retrieve value max in the middle as id_Max_Middle,
        MAX(Id) AS id_Max,            
        COUNT(*) AS Tot
FROM    Table a ( NOLOCK )        
GROUP BY Cod
HAVING  COUNT(*)=4

とに対して行ったように、minとの間の値を取得するにはどうすればよいですか? を使用すると、とが得られますが、必要な値は得られません。maxminmax(SUM(Id) - (MIN(Id)+MAX(Id))summiddle minmax

Cod      |  Id

Stack       10
Stack       15
Stack       11
Stack       40
Overflow    1
Overflow    120
Overflow    15
Overflow    100

必要な出力

Cod         | Min   | Min_In_The_Middle | Max_In_The_Middle | Max

Stack         10          11                   15               40
Overflow      1           15                  100               120
4

4 に答える 4

1

あなたの質問に と のタグが付けられていることの意味がわかりませplsql sql-server。ただし、CTE とウィンドウ関数をサポートするデータベース システムを使用していると仮定します。

やろうとしていることを一般化するには、最初に行番号を行に割り当ててから、ピボットを達成するために必要な手法を使用します。

;WITH OrderedValues as (
    SELECT Cod,Id,ROW_NUMBER() OVER (PARTITION BY Cod ORDER BY Id) as rn
       COUNT(*) OVER (PARTITION BY Cod) as Cnt
    FROM Table (NOLOCK)
), With4Values as (
    SELECT * from OrderedValues where Cnt=4
)
SELECT Cod,
    --However you want to do the pivot. Here I'll use MAX/CASE
    MAX(CASE WHEN rn=1 THEN Id END) as Value1,
    MAX(CASE WHEN rn=2 THEN Id END) as Value2,
    MAX(CASE WHEN rn=3 THEN Id END) as Value3,
    MAX(CASE WHEN rn=4 THEN Id END) as Value4
FROM
    With4Values
GROUP BY
    Cod

3 行または 4 行に関する過度に具体的な質問に答えるよりも、これをより多くの列に拡張する方が簡単であることがわかると思います。ただし、任意の数の列を処理する必要がある場合は、動的 SQL に切り替える必要があります。

于 2012-04-18T12:39:24.537 に答える
1

これを使ってみてください、頑張ってください

WITH temp AS
         (SELECT   cod, MIN (ID) min_id, MAX (ID) max_id
              FROM tab
          GROUP BY cod
            HAVING COUNT (ID) = 4)
    SELECT code, temp.min_id,
           (SELECT   MIN (ID)
                FROM tab
               WHERE cod = temp.cod AND ID NOT IN (temp.min_id)
            GROUP BY cod) min_mid_id,
           (SELECT   MAX (ID)
                FROM tab
               WHERE cod = temp.cod AND ID NOT IN (temp.max_id)
            GROUP BY cod) max_min_id, temp.max_id
      FROM temp;
于 2012-04-18T13:01:19.263 に答える
1

1つだけ[Table|[Clustered] Index]]Scan(デモはこちら):

SELECT  pvt.Cod,
        pvt.[1] AS MinValue,
        pvt.[2] AS MinInterValue,
        pvt.[3] AS MaxInterValue,
        pvt.[4] AS MaxValue
FROM
(
        SELECT  x.Cod, x.ID, x.RowNumAsc
        FROM
        (
                SELECT  *,
                        ROW_NUMBER() OVER(PARTITION BY t.Cod ORDER BY t.ID ASC) RowNumAsc,
                        ROW_NUMBER() OVER(PARTITION BY t.Cod ORDER BY t.ID DESC) RowNumDesc
                FROM    MyTable t
        ) x
        WHERE   x.RowNumAsc = 1 AND x.RowNumDesc = 4
        OR      x.RowNumAsc = 2 AND x.RowNumDesc = 3
        OR      x.RowNumAsc = 3 AND x.RowNumDesc = 2
        OR      x.RowNumAsc = 4 AND x.RowNumDesc = 1

) y
PIVOT   ( MAX(y.ID) FOR y.RowNumAsc IN ([1], [2], [3], [4]) ) pvt;
于 2012-04-18T13:03:53.880 に答える
0

極値を除外し、残りの最小値と最大値を見つけたいと思います。これは私が考えていることですが、実行してテストする機会がありませんでした...

WITH Extremes AS ( SELECT Cod, MAX(ID) AS Id_Max, MIN(ID) AS Id_Min 
                    FROM [Table] a GROUP BY Cod)
SELECT 
  e.Cod,
  e.Id_Min,
  MIN(a.Id) AS id_Min_Middle,
  MAX(a.Id) AS id_Max_Middle,
  e.Id_Max
FROM Extremes e
LEFT JOIN [Table] a ON a.Cod = e.Cod AND a.Id > e.Id_Min AND a.Id < e.Id_Max
GROUP BY e.Cod
于 2012-04-18T12:16:56.593 に答える