1

探しているものをどのように表現すればよいか完全にはわかりませんが、それが検索を困難にしています。しかし、私がやろうとしているのは、個別の列の一致ごとに単一のレコードを返すことです

テーブル構造:

ItemHolderId Name
------------ --------------------------------------------------
1            Holder A
2            Holder B


ItemId      Data                                               ItemHolderId
----------- -------------------------------------------------- ------------
1           Item A                                             1
2           Item B                                             1
3           Item C                                             1
4           Item D                                             1
5           Item E                                             2
6           Item F                                             2
7           Item G                                             2

各アイテムホルダーIDに対して単一のアイテムを選択しようとしています。したがって、たとえば、アイテム A とアイテム E のみが選択されます。順序は、一致した列ごとに 1 つのレコードだけに関係ありません。これを賢明な方法で説明していることを願っています。

御時間ありがとうございます。

4

3 に答える 3

2

SQL Server 2005以降を使用している場合、1つのアプローチはCTE(共通テーブル式)を使用することです(その点で十分に具体的ではありません)。

この CTE を使用すると、データをいくつかの基準 (つまり、独自の基準) でパーティション分割し、ItemHolderIdSQL Server に、それらのパーティションごとに 1 から始まるすべての行に番号を付けて、他の基準で並べ替えることができます (いくつかの基準が必要です-使用する基準はどれですか?あなたへ)。

だから、次のようなことを試してください:

;WITH PartitionedComponents AS
(
   SELECT 
       ih.ItemHolderID, ih.Name, d.Data,
       ROW_NUMBER() OVER(PARTITION BY ih.ItemHolderID ORDER BY d.Data DESC) AS 'RowNum'
   FROM 
       dbo.ItemHolder ih
   INNER JOIN 
       dbo.ItemHolderData d ON ih.ItemHolderID = d.ItemHolderID
   WHERE
       ComponentId IN (.....) 
       AND ConsoleTimeStamp <= (threshold)
)
SELECT 
   ItemHolderID, Name, Data
FROM 
   PartitionedComponents
WHERE
   RowNum = 1

ここでは、各「パーティション」(つまり、各ItemHolderId) の最後の 2 つのエントリのみを選択しています。これは、「データ」列の降順で並べられています。

それはあなたが探しているものに近づきますか??

于 2012-06-30T06:54:50.907 に答える
2

を使用row_number()してユーザーごとにデータを分割し、「1」を として各レコードを取得できます[rank]。このようにして、データのパーティションとソートを制御して、値「1」が与えられて返されるレコードを制御できます...

/* Setup tables for query */
declare @tbl1 table (ItemHolderId int, Name varchar(32))
declare @tbl2 table (ItemId int, Data varchar(32), ItemHolderId int)

insert into @tbl1 values (1, 'Holder A'), (2, 'Holder B')

insert into @tbl2 values (1, 'Item A', 1), (2, 'Item B', 1), (3, 'Item C', 1), (4, 'Item D', 1)
insert into @tbl2 values (5, 'Item E', 2), (6, 'Item F', 2), (7, 'Item G', 2)

/* Select data */
select t2.*, row_number() over (partition by t1.ItemHolderId order by t2.ItemHolderId) as [rank]
into #temp
from @tbl1 t1 inner join @tbl2 t2 on t1.ItemHolderId = t2.ItemHolderId

select ItemId, Data, ItemHolderId from #temp where [rank] = 1

drop table #temp
于 2012-06-30T07:08:53.543 に答える
0

itemholderid 列にも group by function を使用できると思います。役立つと思います。

select 
   rownum itemId, 
   tmp.name , 
   tmp.itemholderid  
from 
   (select 
       min(t.name) name, 
       t.itemholderid  
    from 
       table_name t 
    group by t.itemholderid
   )tmp;
于 2012-06-30T07:02:57.177 に答える