簡體   English   中英

SQL 后續分組行

[英]SQL sequent grouped rows

+------+------+------+------------+
| id   | room | type | created_at |
+------+------+------+------------+
| 8214*|   83 | msg* | 1571726466 |
| 8213 |   83 | msg* | 1571724983 |
| 8212 |   83 | ad   | 1571724982 |
| 8211 |   83 | msg  | 1571724978 |
| 8210 |   83 | msg  | 1570861659 |
| 8209 |   83 | msg  | 1570861656 |
| 8208 |   83 | msg  | 1570861650 |
| 8207 |   83 | ad   | 1570861643 |
| 8206 |   83 | msg  | 1570861632 |
| 8255*|   82 | msg* | 1571732235 |
| 8254 |   82 | msg* | 1571732235 |
| 8253 |   82 | msg* | 1571732235 |
| 8252 |   82 | msg* | 1571732235 |
| 8251 |   82 | msg* | 1571732234 |
| 8250 |   82 | ad   | 1571732234 |
| 8249 |   82 | msg  | 1571732234 |
| 8248 |   82 | msg  | 1571732234 |
| 8247 |   82 | msg  | 1571732234 |
| 8246 |   82 | msg  | 1571732234 |
| 8245 |   82 | msg  | 1571732233 |
| 8244 |   82 | msg  | 1571732233 |
| 8243 |   82 | msg  | 1571732233 |
| 8242 |   82 | ad   | 1571732232 |
| 8241 |   82 | msg  | 1571732232 |
| 8240 |   82 | msg  | 1571732232 |
| 8239 |   82 | msg  | 1571732231 |
| 8238 |   82 | msg  | 1571732231 |
| 8237 |   82 | ad   | 1571732231 |
| 8236 |   82 | msg  | 1571732231 |
| 8235 |   82 | msg  | 1571732231 |
| 8234 |   82 | msg  | 1571732230 |
| 8233 |   82 | msg  | 1571732230 |
| 8232 |   82 | msg  | 1571732230 |
| 8231 |   82 | msg  | 1571732230 |
| 8230 |   82 | msg  | 1571732230 |
| 8229 |   82 | msg  | 1571732229 |
| 8228 |   82 | msg  | 1571732228 |
| 8227 |   82 | msg  | 1571732228 |
| 8226 |   82 | msg  | 1571732228 |
| 8225 |   82 | msg  | 1571732227 |
| 8224 |   82 | msg  | 1571732227 |
| 8223 |   82 | ad   | 1571732227 |
| 8222 |   82 | msg  | 1571732226 |
| 8221 |   82 | msg  | 1571732223 |
| 8220 |   82 | msg  | 1571732223 |

我有“消息”表。 可能有常規消息或廣告。 每條消息都屬於房間。 我需要按日期在每個房間中獲取最后一條消息,並且在此選擇中,必須在第一次遇到“廣告”類型之前計算每條常規消息(類型 = msg),因為消息的順序是降序的。

預期可能會更好地解釋我需要什么:

+------+------+------+------------+-----------+
| id   | room | type | created_at | count_msg |
+------+------+------+------------+-----------+
| 8214 |   83 | msg  | 1571726466 | 2         |
| 8255 |   82 | msg  | 1571732235 | 5         |
+------+------+------+------------+-----------+

在源代碼中,我用“*”標記了哪些行應該在結果中計數/顯示。

PS。 如果語法錯誤,請見諒。

UPD:如果是相同的 created_at,我想它也應該按 id desc 排序。

從您預期的 output 看來,在最后一個廣告出現后,您似乎需要所有 msg 行。 這可以使用子查詢輕松實現 -

SELECT MAX(T1.id), T1.room, type, MAX(created_at), COUNT(*) count_msg
FROM YOUR_TABLE T1
JOIN (SELECT MAX(id) id, room
      FROM YOUR_TAB
      WHERE type = 'ad'
      GROUP BY room) T2 ON T1.id > T2.id AND T1.room = T2.room
GROUP BY room, type

是小提琴。

您似乎想要最后一個'ad'之后的所有消息 - 至少基於您的數據。

我考慮使用相關子查詢和聚合進行過濾:

select t2.room, max(t.id), t.type, max(t.created_at), count(*)
from t
where t.id > (select max(t2.id)
              from t t2
              where t2.room = t.room and t2.type = 'ad'
             )
group by t.room, t.type;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM