0

私は以下のようなテーブル構造を持っています。User_Id =100どこで、どこでUser_sub_id = 1time_used = minimum of allどこTimestampで最高の行を選択する必要があります。私のクエリの出力は次のようになります。

US;1365510103204;NY;1365510103;100;1;678;

私のクエリは次のようになります。

select * 
from my_table 
where CODE='DE' 
  and User_Id = 100 
  and User_sub_id = 1 
 and time_used = (select min(time_used) 
                  from my_table 
                  where CODE='DE' 
                    and User_Id=100 
                    and User_sub_id= 1);

これにより、4行すべてが返されます。タイムスタンプが最も高い 1 つだけが必要です。どうもありがとう

CODE:   Timestamp:  Location:   Time_recorded:  User_Id:    User_sub_Id:    time_used
"US;1365510102420;NY;1365510102;100;1;1078;
"US;1365510102719;NY;1365510102;100;1;978;
"US;1365510103204;NY;1365510103;100;1;878;
"US;1365510102232;NY;1365510102;100;1;678;
"US;1365510102420;NY;1365510102;100;1;678;
"US;1365510102719;NY;1365510102;100;1;678;
"US;1365510103204;NY;1365510103;100;1;678;
"US;1365510102420;NY;1365510102;101;1;678;
"US;1365510102719;NY;1365510102;101;1;638;
"US;1365510103204;NY;1365510103;101;1;638;
4

3 に答える 3

2

別のおそらくより高速な解決策は、ウィンドウ関数を使用することです。

select * 
from (
  select code,
         timestamp,
         min(time_used) over (partition by user_id, user_sub_id) as min_used,
         row_number() over (partition by user_id, user_sub_id order by timestamp desc) as rn,
         time_used,
         user_id, 
         user_sub_id
  from my_table 
  where CODE='US' 
    and User_Id = 100 
    and User_sub_id = 1 
) t
where time_used = min_used
  and rn = 1;

これは、サブセレクトを使用したソリューションが行っているように、テーブルを 2 回ではなく 1 回スキャンするだけで済みます。

列の名前を変更することを強くお勧めしますtimestamp

まず、これは予約語であり、使用はお勧めしません。

そして第二に、それは何も文書化していません-それ自体が恐ろしい名前です。time_usedははるかに優れており、同様のものを見つける必要がありますtimestamp。それは「収録時間」「有効期限」「期限」なのか、それとも全く違うものなのか。

于 2013-05-03T12:37:33.183 に答える
1

次に、これを試してください:

select *
from my_table
where CODE='DE'
  and User_Id=100
  and User_sub_id=1
  and time_used=(
    select min(time_used)
    from my_table
    where CODE='DE'
    and User_Id=100 and User_sub_id=1
  )
order by "timestamp" desc --   <-- this adds sorting
limit 1; --   <-- this retrieves only one row
于 2013-05-03T12:16:15.140 に答える
0

クエリに次の条件を追加します

ORDER BY タイムスタンプ DESC、LIMIT 1

于 2013-05-03T12:18:23.587 に答える