[SQL] uzņemiet jaunāko ierakstu par katru lietotāju (grupa ieņem Top n)
Take Most Recent Record Each User
Man nav bijis laika rakstīt un kopīgot, un visbeidzot pagaidiet līdz divpadsmit vienpadsmit, nav atļauta nekāda prasība, šoreiz jāvelta laiks, lai vairākas dienas sakārtotu savākto SQL.
Prasība: Es atradu lietotāja jaunāko pieteikšanās ierakstu. (110w)
Priekšnosacījums: noklusējuma laiks un ID ir pieaugums. (Palielināt laiku -> pieprasīt maksimālo id)
The first type: select * from user_login_log where id in (select max (id) from user_login_log group by user_id) takes 6.35s Second: select * from user_login_log where exists (select max(id) from user_login_log group by user_id) takes 3.47s The third type: select * from user_login_log a join (select max(id) as id from user_login_log group by user_id) b on a.id=b.id takes 3.65s The fourth type: select * from user_login_log a , (select max(id) as id from user_login_log group by user_id) b where a.id=b.id takes 3.65s The fifth type: select * from user_login_log a where 1>=(select count(1) from user_login_log b where a.user_id=b.user_id and a.id<=b.id) order by user_id , id desc takes 1000s+ Sixth: select *, GROUP_CONCAT(login_ip_str order by id desc) from user_login_log group by user_id It takes 200.32s Seventh: select * from(SELECT (@row_number:=CASE WHEN @customer_no = user_id THEN @row_number + 1 ELSE 1 END) AS num, @customer_no:=user_id AS user_id, id, login_ip_str,created_date FROM user_login_log ORDER BY user_id ,created_date desc)x where x.num=1 takes 24.1s
1. variants: + max ()
Paskaidrojums: Atlasiet maksimālo ID katram lietotājam un pēc tam vaicājiet ar in. Piemērots visām datu bāzēm,
2. iespēja: pastāv + max ()
Paskaidrojums: Atlasiet katram lietotājam maksimālo ID. Pēc tam izmantojiet šī ID un tabulas ID, lai veiktu nosacījumu kur plus plus 1, jo pastāv saturs.
3. variants: pievienoties + max ()
Paskaidrojums: Atlasiet katram lietotājam maksimālo ID. Pēc tam paņemiet pievienošanās pilnu tabulu atbilstoši ID un izņemiet visu informāciju, kas atbilst id.
4. variants: kur + max ()
Paskaidrojums: Ja kopīgā pārbaude tiks optimizēta par savienojuma vaicājumu, visi efekti un tie paši trīs.
5. variants: pašapvienošanās + skaits ()
Paskaidrojums: Ideja ir spriest, vai katram ierakstam ir vairāk ierakstu nekā vietējam. Ja tikai viens ir lielāks par sevi, tas ir konsekvents. Filtrējiet visus ierakstus un visbeidzot kārtojiet pēc grupas nosaukuma un vērtības. Bet viņš veica n skaitīšanas (*) aprēķinus, tāpēc sniegums bija slikts.
6. variants: GROUP_CONCAT + pārtveršana
Paskaidrojums: Izmantojiet grupas GROUP_CONCAT šķirošanas funkciju , kārtojiet un savienojiet visus katra lietotāja ierakstus vienā laukā un pēc tam pārtveriet pirmo vienumu. Attiecas uz mysql, taču šī metode ir ļoti neefektīva, ar metodi var atgriezt tikai neseno lauku, ja jums jāatgriež visa informācija par jaunāko nepieciešamību * izmantot funkcijā, tāpēc parasti veic tikai ideju.
7. variants: pagaidu mainīgie
Paskaidrojums: Faktiski tas ir jānosaka, vai pašreizējā rindas user_id vērtība ir tāda pati kā iepriekšējās rindas user_id vērtība. Ja tas nav vienāds, tas tiek numurēts (1. izvade), tādējādi realizējot grupēšanas secības numerācijas funkciju. (Gadījumā, ja sprieduma nosacījums ir piešķirts pirms klienta_nav piešķiršanas), šis pēdējo dažu aprēķins var norādīt laika saīsināšanas ierobežojumu, saīsinātu līdz 1s.
1. Starp tiem pieci, seši un septiņi var sasniegt ne tikai jaunāko, bet arī Top n prasības, kuras var izmantot nevis ROW_NUMBER () over (PARTITION BY xx ORDER BY ** DESC), bet shēmu. 7 ir labāks sniegums.
2. Hive, Oracle, SqlServer parasti izmanto ROW_NUMBER () pāri (PARTITION BY xx ORDER BY ** DESC), lai sasniegtu Top n grupēšanas problēmu.
3. mysql8 iepriekš nav logēšanas funkcijas, tāpēc to var ieviest tikai ar tā piecu shēmu un septiņu shēmu.
Laipni lūdzam pievienot ~!