次のステートメントを実行した後:
SELECT Category FROM MonitoringJob ORDER BY CreationDate DESC
データベースから次の値を取得しています:
test3
test3
bildung
test4
test3
test2
test1
しかし、私は次のように重複を削除したい:
bildung
test4
test3
test2
test1
DISTINCTを使用しようとしましたが、1つのステートメントでORDER BYが機能しません。助けてください。
重要:
私はそれを試しました:
SELECT DISTINCT Category FROM MonitoringJob ORDER BY CreationDate DESC
機能しません。
CreationDateによる順序は非常に重要です。
問題は、ORDER BY
で使用される列がDISTINCT
で指定されていないことです。これを行うには、 集計関数 を使用してソートし、GROUP BY
を使用してDISTINCT
を機能させる必要があります。
次のようなものを試してください:
SELECT DISTINCT Category, MAX(CreationDate)
FROM MonitoringJob
GROUP BY Category
ORDER BY MAX(CreationDate) DESC, Category
何をしたいのかがうまくいかない理由は、 SQLの操作の論理的な順序 のためです。
FROM MonitoringJob
SELECT Category, CreationDate
つまり、いわゆる拡張ソートキー列を追加しますORDER BY CreationDate DESC
SELECT Category
つまり、結果から拡張ソートキー列を再度削除します。そのため、SQL標準拡張ソートキー列機能のおかげで、SELECT
句にないもので並べ替えることができます。一時的にバックグラウンドで追加されます。
DISTINCT
でこれが機能しないのでしょうか?DISTINCT
操作を追加すると、SELECT
とORDER BY
の間に追加されます。
FROM MonitoringJob
SELECT Category, CreationDate
DISTINCT
ORDER BY CreationDate DESC
SELECT Category
しかし、拡張ソートキー列CreationDate
では、DISTINCT
操作のセマンティクスが変更されたため、結果は同じではなくなりました。これは私たちが望んでいるものではないため、SQL標準とすべての妥当なデータベースの両方がこの使用を禁止しています。
次のような標準構文でエミュレートできます
SELECT Category
FROM (
SELECT Category, MAX(CreationDate) AS CreationDate
FROM MonitoringJob
GROUP BY Category
) t
ORDER BY CreationDate DESC
または、 Prutswonder で示されるように、単に(この場合)
SELECT Category, MAX(CreationDate) AS CreationDate
FROM MonitoringJob
GROUP BY Category
ORDER BY CreationDate DESC
元の質問の例のように、MAX(CreationDate)の出力が必要ない場合、唯一の答えはPrashant Guptaの答えの2番目のステートメントです。
SELECT [Category] FROM [MonitoringJob]
GROUP BY [Category] ORDER BY MAX([CreationDate]) DESC
説明:インライン関数でORDER BY句を使用することはできません。そのため、Prutwonderの答えのステートメントはこの場合は使用できません。外側の選択をその周囲に配置して、MAX(CreationDate)部分を破棄することはできません。
[Category]列と[CreationDate]列の値が必要な場合は、このコードを使用してください
SELECT [Category], MAX([CreationDate]) FROM [MonitoringJob]
GROUP BY [Category] ORDER BY MAX([CreationDate]) DESC
または、[Category]列の値のみが必要な場合は、このコードを使用します。
SELECT [Category] FROM [MonitoringJob]
GROUP BY [Category] ORDER BY MAX([CreationDate]) DESC
必要なものはすべて、個別のレコードになります。
2)CreationDateによる順序は非常に重要です
元の結果は、「test3」に複数の結果があることを示していました...
Group Byの重複を削除するために常にMAXの使用を開始するのは非常に簡単です...そして、根本的な質問が何であるかを忘れるか無視します...
OPは、MAXを使用すると最後の「作成済み」が提供され、MINを使用すると最初の「作成済み」が提供されることに気付いたと思われます...
if object_id ('tempdb..#tempreport') is not null
begin
drop table #tempreport
end
create table #tempreport (
Category nvarchar(510),
CreationDate smallint )
insert into #tempreport
select distinct Category from MonitoringJob (nolock)
select * from #tempreport ORDER BY CreationDate DESC
Distinctは、レコードを昇順でソートします。降順でソートする場合は、次を使用します
SELECT DISTINCT Category
FROM MonitoringJob
ORDER BY Category DESC
CreationDateフィールドに基づいてレコードをソートする場合、このフィールドはselectステートメントに含まれている必要があります。
SELECT DISTINCT Category, creationDate
FROM MonitoringJob
ORDER BY CreationDate DESC
サブクエリによって、それは動作するはずです:
SELECT distinct(Category) from MonitoringJob where Category in(select Category from MonitoringJob order by CreationDate desc);
CTEを使用できます。
WITH DistinctMonitoringJob AS (
SELECT DISTINCT Category Distinct_Category FROM MonitoringJob
)
SELECT Distinct_Category
FROM DistinctMonitoringJob
ORDER BY Distinct_Category DESC