2016-12-23 15 views
0

SQL ServerのDBから最新のレコードを選択します。唯一1項目を選択した場合、最終的な出力はこれです:複数のUNIONとORDER BYのSELECT TOP

SELECT TOP(10) * from dbo.Eventos WHERE Tipo LIKE '%OS%' AND Distrito LIKE '%' 

+常に末尾に追加しました:それは時々プログラム的なものに変更されるようDistrito LIKE '%'が滞在する必要があります。

ORDER BY Data DESC 

NOTE%以外。

さらに多くのアイテムが選択されている場合、各アイテムにはUNIONがプログラムによって追加されます。最後に、いつものようにORDER BYが追加されます。全4個の商品を持つ例がチェック:

SELECT TOP(10) * from dbo.Eventos WHERE Tipo LIKE '%OS%' AND Distrito LIKE '%' 
UNION ALL SELECT TOP(10) * from dbo.Eventos WHERE Tipo LIKE '%Rad%' AND Distrito LIKE '%' 
UNION ALL SELECT TOP(10) * from dbo.Eventos WHERE Tipo LIKE '%Aci%' AND Distrito LIKE '%' 
UNION ALL SELECT TOP(10) * from dbo.Eventos WHERE Tipo LIKE '%Out%' AND Distrito LIKE '%' 
ORDER BY Data DESC 

しかし、これは私に、各WHERE句のOLDEST 10の結果BY Data DESC並べ替えを提供します。

どうすれば入手できますか?NEWEST各項目のX結果(WHERE)?

+0

これは実際にはmySQLではなくSQLサーバーのようです。あなたのタグは正しいですか? – xQbert

答えて

0

私が正しく理解していれば、os、rad、aci、outのような各tipoの最新の10個のイベントが必要です。あなたはデータを見ることで最新のものを判断します(私はそれが日付フィールドであると仮定しています)。これは、すべてのユニオンなしでtipoによってROW_NUMBERパーティションを使用することで実現できます。 tipoのワイルドカードがあるので、それらを同じセットに定義する必要があります。これはwindow関数内のcase文で行うことができます。

私は、ディストリビューションが実装されたときに各tipoに同じ値を持つと仮定しています。我々はそれらによって制限することができます前に、結果はrownumbersのために生成する必要があるので、私たちは、共通テーブル式(CTE)を使用

WITH CTE AS (
    SELECT E.*, Row_number() over (partition by 
     CASE WHEN Tipo LIKE '%OS%' then 'OS' 
      WHEN Tipo like '%Rad%' then 'Rad' 
      WHEN Tipo LIKE '%Aci%' then 'ACI' 
      WHEN tipo LIKE '%Out%' then 'OUT' end order by data Desc) RN 
    FROM dbo.Eventos E 
    WHERE (Tipo LIKE '%OS%' OR Tipo LIKE '%Rad%' OR Tipo LIKE '%Aci%' OR Tipo LIKE '%Out%') 
     AND Distrito like '%') 
SELECT * 
FROM cte 
WHERE RN <=10; 

。 row_numberはtipoごとに再起動するので、先頭に置き換えるには< = 10にするだけです。

それとも、あなたは何をやったかに構築する...

SELECT * FROM (
    SELECT * FROM 
    (SELECT TOP(10) * from dbo.Eventos WHERE Tipo LIKE '%OS%' AND Distrito LIKE '%' ORDER BY DATA desc) A 
    UNION ALL 
    SELECT * FROM 
    (SELECT TOP(10) * from dbo.Eventos WHERE Tipo LIKE '%Rad%' AND Distrito LIKE '%' ORDER BY DATA DESC) B 
    UNION ALL 
    SELECT * FROM 
    (SELECT TOP(10) * from dbo.Eventos WHERE Tipo LIKE '%Aci%' AND Distrito LIKE '%' ORDER BY DATA DESC) C 
    UNION ALL 
    SELECT * FROM 
    (SELECT TOP(10) * from dbo.Eventos WHERE Tipo LIKE '%Out%' AND Distrito LIKE '%' ORDER BY Data DESC) D 
) E 
ORDER BY DATA DESC; 

あなたは、各TIPOのグループ化のための右のトップ10を取得することで、自分の順番を持つサブクエリを必要としています。これを実現するには、各問合せがインライン・ビューとして機能し、共用体が発生する前に完全にマテリアライズ(実際にデータを生成)する必要があります。

+0

あなたの最初の解決策は私に 'Row_number'の近くに不正な構文を与えます。あなたの2番目の解決策も動作しません(3 '誤った構文のキーワード' ORDER''エラー、行5,7,9)の近くに、しかし、私が必要とするものがあります(追加のSELECT(UNION)がプログラム的に追加されます)。 – Dillinger

+1

最初のものにはE. *とrow_numberの間にカンマがありませんでした.2番目のものには複数のselectが必要でしたが、いくつかの()が必要でした。 – xQbert

+0

第1のものは第2の解決策よりもプログラム的に実装するのが簡単ではなく、まさに私が望むように機能しました。 – Dillinger