1

今日、私はこの質問をして解決しましたが、今はもう1つの列をリストする修正を行っています(可能な場合はランキング機能を使用して)

車両の私のテーブルは次のとおりです。

vehNo   tTime                     odo     address
ABC     2013-02-13 10:30:00       80       denver
ABC     2013-02-12 10:30:00       10       boston
ABC     2013-02-12 12:30:00       30       berlin
ABC     2013-02-13 01:30:00       40       montreal
ABC     2013-02-13 02:30:00       40       montreal
ABC     2013-02-13 03:30:00       40       montreal

XYZ     2013-02-13 03:33:00       44       houston
ABC     2013-02-13 04:30:00       60       madrid
ABC     2013-02-13 11:30:00       100      alaska

現在、以下のクエリは正常に機能します (2 つの時間の間に 3 つの列をリストします)。

select vehNo, max(tTime) as [tTime], odo
from Table_3
where vehNo = 'ABC' and tTime between '2013-02-12 10:30:00' and '2013-02-13 10:30:00'
group by vehNo, odo
order by vehNo, odo;

したがって、aggregate() と group by がなければ、4 番目に「アドレス」を指定して、次のように必要な結果を取得できます。

vehNo   tTime                     odo     address
ABC     2013-02-12 10:30:00       10     boston
ABC     2013-02-12 12:30:00       30     berlin
ABC     2013-02-13 03:30:00       40     montreal(time latest, ignoring 1:30 & 2:30)
ABC     2013-02-13 04:30:00       60     madrid
ABC     2013-02-13 10:30:00       80     denver

SQL Server 2005 で実行していますが、ランキング機能を使用することは可能ですか..

4

5 に答える 5

4

代わりにこれを試してください:

WITH CTE
AS
(
   SELECT *,
     ROW_NUMBER() OVER(PARTITION BY vehNo, odo
                       ORDER BY tTime DESC) AS RowNum 
   FROM table_3
   where vehNo = 'ABC' 
     and tTime between '2013-02-12 10:30:00' 
                   and '2013-02-13 10:30:00'
)
SELECT *
FROM CTE
WHERE RowNum = 1;

SQL フィドルのデモ

于 2013-03-28T15:06:47.800 に答える
3

ウィンドウ処理/ランキング関数を使用して結果を取得できます。row_number()または のいずれかが表示される 2 つのオプションがありますrank()。ウィンドウ関数を使用する場合は、WHERE句を使用して、ランクが 1 の行のみを返します。

それぞれに同時にrank()2 つのエントリがある場合、 は複数の行を返します。最初の行のみを返します。そのため、状況に最適な関数を決定する必要があります。vehNoaddressrow_number()

select vehNo, tTime, odo, address
from 
(
  select vehNo, tTime, odo, address,
    rank() over(partition by vehNo, odo order by tTime desc) rnk
  from yourtable
  where vehNo = 'ABC' 
    and tTime between '2013-02-12 10:30:00' and '2013-02-13 10:30:00'
) d
where rnk = 1

SQL Fiddle with Demoを参照してください。

于 2013-03-28T15:08:57.153 に答える
1

CTE を使用します。

WITH ag 
(
    select vehNo, max(tTime) as [tTime], odo
    from Table_3
    where vehNo = 'ABC' 
      and tTime between '2013-02-12 10:30:00' 
                    and '2013-02-13 10:30:00'
    group by vehNo, odo
)
select vehNO, tTime, odo, T.address
from ag 
inner join ag on Table_3 T on ag.vehNo=T.vehNo
order by vehNo, odo;
于 2013-03-28T15:08:30.227 に答える
0

次の手順を実行してください。

MAX(address)

varchar ですが、MAX を使用できます。

于 2013-03-28T15:10:25.790 に答える
0

機能を使ってみましたrow_number()か?

select 
row_number() OVER (ORDER BY vehNo) AS period,
vehNo, max(tTime) as [tTime], odo
from Table_3
where vehNo = 'ABC' and tTime between '2013-02-12 10:30:00' and '2013-02-13 10:30:00'
group by vehNo, odo
order by vehNo, odo;
于 2013-03-28T15:08:27.620 に答える