2

[質問]に続いて:T-SQLマトリックステーブルの空き位置 をクエリするマトリックステーブルをLIFOとして処理しようとしています。(X、Z)の各カップルは、要素を格納できるチャネルを表します。場所を生成するときは、上記の質問と以下の質問で提供されているクエリを使用しています。

SELECT x, z, MAX(CASE WHEN disabled = 0 AND occupiedId IS NULL THEN Y ELSE 0 END) firstFreeY
FROM matrix
GROUP BY x, z
ORDER BY x, z;

これは機能していますが、「穴」は処理しません。実際、Disabledフラグがテーブルから削除されているか、要素が手動で削除されている可能性があります。

私のMatrixテーブルが次のようになる場合:

X   Z   Y   Disabled    OccupiedId
--------------------------------------------------
1   1   1   0   591
1   1   2   0   NULL
1   1   3   1   NULL
1   1   4   0   524
1   1   5   0   523
1   1   6   0   522
1   1   7   0   484
1   2   1   0   NULL
1   2   2   0   NULL
1   2   3   0   NULL
1   2   4   0   NULL
1   2   5   0   NULL
1   2   6   0   589
1   2   7   0   592 

上記のクエリの結果は次のとおりです。

X   Z   firstFreeY
------------------------
1   1   2
1   2   5

それ以外の:

X   Y   firstFreeY
------------------------
1   1   0
1   2   5

これを達成する方法について何か提案はありますか?

4

2 に答える 2

2

このクエリは、他のすべての占有Yよりも小さい最大のYを探します。

select  m1.X
,       m1.Z
,       max(
        case
        when m2.MinOccupiedY is null or m1.Y < m2.MinOccupiedY then m1.Y
        else 0
        end
        ) as FirstFreeY
from    matrix m1
join    (
        select  X
        ,       Z
        ,       min(
                case 
                when disabled <> 0 or occupiedId is not null then Y
                end
                ) as MinOccupiedY
        from    matrix 
        group by
                X
        ,       Z
        ) m2
on      m1.X = m2.X
        and m1.Z = m2.Z
group by
        m1.X
,       m1.Z

SQLFiddleでの実例。

于 2012-11-14T10:11:45.940 に答える
1

あなたが何を求めているのか理解できたかどうかを知るためだけに、これも機能していますか?

select distinct
m1.x,m1.z, o.y
from
  matrix m1
cross apply
(
  select top 1 (case when m2.Disabled = 0 then m2.y else 0 end)
  from matrix m2
  where
        m1.x = m2.x
    and m1.z = m2.z
    and m2.OccupiedId is null
  order by m2.y desc
) o (y);
于 2012-11-14T10:53:56.797 に答える