1
CREATE TABLE Items
(
  ItemId INT NOT NULL,
  CategoryId INT NOT NULL,
  ItemValue INT NOT NULL
)

テーブルにはアイテムが含まれています。すべてのアイテムはカテゴリに属し、数値を格納します。

クエリの結果として、各行でカテゴリを表す必要があります。次の 3 つの列が必要です。

  • カテゴリ ID;
  • ItemValueカテゴリごとに最高のアイテムの ID 。
  • ItemValueカテゴリごとに最低のアイテムの ID 。

クエリのパフォーマンスは重要です。MS SQL Server を使用しています。

4

3 に答える 3

2

SQL Server 2005+ の場合、次の操作を実行できます。

;WITH CTE AS
(
    SELECT  *, 
            ROW_NUMBER() OVER(PARTITION BY CategoryId ORDER BY ItemValue DESC) MaxRN,
            ROW_NUMBER() OVER(PARTITION BY CategoryId ORDER BY ItemValue) MinRN
    FROM Items
)
SELECT  CategoryId, 
        MIN(CASE WHEN MaxRN = 1 THEN ItemId END) IdMaxValue,
        MIN(CASE WHEN MinRN = 1 THEN ItemId END) IdMinValue
FROM CTE
GROUP BY CategoryId;

これは、このソリューションをテストできるフィドルです。

于 2012-07-25T14:21:42.357 に答える
1

これを試して:

;with 
cte as(
    select *,ROW_NUMBER() over(partition by [CategoryId] order by [ItemValue]) rownum
    from [Items] ),
cte1 as(select [CategoryId],MIN([ItemId]) [min_ItemId]
    from cte where rownum=1
    group by [CategoryId]),
cte2 as(
    select *,ROW_NUMBER() over(partition by [CategoryId] order by [ItemValue]) rownum
    from [Items] ),
cte3 as( 
    select [CategoryId],MAX([ItemId]) [max_ItemId]
    from cte2 C1
    where rownum=(select MAX(rownum) from cte C2 where C1.[CategoryId]=C2.[CategoryId])
    group by [CategoryId])
select A.[CategoryId],A.[min_ItemId],B.[max_ItemId] 
from cte1 A join cte3 B
on A.[CategoryId]=B.[CategoryId]
于 2012-07-25T14:37:19.060 に答える
1

一般的なテーブル式を試してみます:

WITH CategoryHigh (High, ItemId, CategoryId) 
AS 
(
SELECT 
    ROW_NUMBER() OVER (PARTITION BY CategoryId ORDER BY ItemValue DESC) AS High,
    ItemId,
    CategoryId
FROM Items
),
CategoryLow (Low, ItemId, CategoryId) 
AS
(
SELECT 
    ROW_NUMBER() OVER (PARTITION BY CategoryId ORDER BY ItemValue) AS Low,
    ItemId,
    CategoryId
FROM Items
)
SELECT 
H.CategoryId,
L.ItemId AS LowItem,
H.ItemId AS HighItem
FROM CategoryHigh H
JOIN CategoryLow L ON H.CategoryId = L.CategoryId
WHERE H.High = 1 AND
      L.Low = 1
于 2012-07-25T14:16:34.643 に答える