1

私は、並べ替えられた行 (order by) と union ステートメントの両方を必要とするこのクエリに取り組んでいます。私がやりたいことは、顧客ごとに時間に応じて最新の読み取り値を取得することです。ユニオンステートメント内でオーダーバイを使用できないことはわかっていますが、私が望むものを達成する方法はありますか? selectステートメントで結合されたいくつかのテーブルもあります。以下は私のサンプルクエリです:

select  top 1 name, ID, Date, Time, Cust_ID
from Table1
join Table2
on ID = Cust_ID
join Table3
on c = d
where ID = 'ID0001' 
(order by Time desc)
union all
select  top 1 name, ID, Date, Time, Cust_ID
from Table1
join Table2
on ID = Cust_ID
join Table3
on c = d
where ID = 'ID0002' 
(order by Time desc)
union all
select  top 1 name, ID, Date, Time, Cust_ID
from Table1
join Table2
on ID = Cust_ID
join Table3
on c = d
where ID = 'ID0003' 
(order by Time desc)

そのため、これらの結果が得られるものを探しています。誰もそのような方法を知っていますか?ありがとう

4

3 に答える 3

3

クエリ全体の最後に order by 句を配置するだけです。

select  top 1 name, ID, Date, Time, Cust_ID
from Table1
join Table2
on ID = Cust_ID
join Table3
on c = d
where ID = 'ID0001' 

union all
select  top 1 name, ID, Date, Time, Cust_ID
from Table1
join Table2
on ID = Cust_ID
join Table3
on c = d
where ID = 'ID0002' 

union all
select  top 1 name, ID, Date, Time, Cust_ID
from Table1
join Table2
on ID = Cust_ID
join Table3
on c = d
where ID = 'ID0003' 
order by ID, Time desc

編集された説明

上記の Order by 句で行った変更に注意してください。最初に ID の昇順で並べ替えられ、次に顧客の時間の降順で並べ替えられます。

于 2012-07-03T16:32:19.810 に答える
1

これは、古典的問題のようです。SQL Server 2005以降のバージョンでは、次のROW_NUMBER()関数を使用して簡単に解決できます。

WITH ranked AS (
  SELECT
    name, ID, Date, Time, Cust_ID,
    rnk = ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Time DESC)
  FROM Table1
  JOIN Table2 ON ID = Cust_ID
  JOIN Table3 ON c = d
  WHERE ID = 'ID0001'
)
SELECT name, ID, Date, Time, Cust_ID
FROM ranked
WHERE ID IN ('ID0001', 'ID0002', 'ID0003')
  AND rnk = 1

つまり、を使用してROW_NUMBER()、行のすべてのグループの行をID降順で同じTimeものにランク付けし、次に、上位にランク付けされ、特定のグループに属する(つまり、特定のID値を持つ)行を選択します。

于 2012-07-03T21:08:03.973 に答える
1
select * from (
select  top 1 name, ID, Date, Time, Cust_ID from Table1
join Table2 on ID = Cust_ID
join Table3 on c = d
where ID = 'ID0001' 
union all
select  top 1 name, ID, Date, Time, Cust_ID from Table1
join Table2 on ID = Cust_ID
join Table3 on c = d
where ID = 'ID0002' 
union all
select  top 1 name, ID, Date, Time, Cust_ID from Table1
join Table2 on ID = Cust_ID
join Table3 on c = d
where ID = 'ID0003')
order by ID, Time desc
于 2012-07-03T16:24:29.430 に答える