0

LastUpdatedDateTime の降順で下の表のトップ カテゴリを選択する、より洗練された方法が必要です。基本的に、CategoryID ごとに各カテゴリの最新の単一行のみを表示したいだけです。

私は次のことを行うことでそれを得ることができます...

SELECT Category,
   MAX(LastUpdateDateTime) as LastUpdateDateTime
INTO #t
FROM Settings
WHERE CatalogID = 123
GROUP BY Category
ORDER BY Category

SELECT s.*
FROM Settings s
INNER JOIN #t t
ON s.Category = t.Category
AND s.LastUpdateDateTime = t.LastUpdateDateTime

--> 設定表

CREATE TABLE [dbo].[Settings](
[ID] [int] IDENTITY(1,1) NOT NULL,
[CatalogID] [int] NOT NULL,
[Category] [varchar](50) NOT NULL,
[Facings] [bit] NOT NULL,
[Quantity] [bit] NOT NULL,
[LastUpdateDateTime] [datetime] NOT NULL,
 CONSTRAINT [PK_Settings_1] PRIMARY KEY CLUSTERED 
 (
[ID] ASC,
[CatalogID] ASC,
[Category] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,     ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

これは非常に簡単です。これをもう少し効率的に行うために正しい方向に向けてくれる人を探しているだけです。私が持っているものは動作します。リファクタリングをお願いします。

ご覧いただきありがとうございます。

-B

4

1 に答える 1

4

サブクエリはどうですか:

select s1.*
from settings s1
inner join
(
  select category, max(LastUpdateDateTime) as LastUpdateDateTime
  from settings
  where catalogid = 123
  group by category
) s2
  on s1.category = s2.category
  and s1.LastUpdateDateTime = s2.LastUpdateDateTime

またはCTEを使用することもできます:

;with cte as
(
  select *, 
    row_number() over(partition by catalogid 
                      order by LastUpdateDateTime desc) rn
  from settings
  where catalogid = 123
)
select *
from cte
where rn = 1
于 2012-09-26T18:08:20.363 に答える