sql經典問題 查詢連續的時間

2021-07-02 18:40:22 字數 1748 閱讀 1341

今天遇到乙個問題,需要查詢使用者連續下單的月份

這個跟查詢使用者連續登陸的天數一樣 都是查詢連續的時間或者數字

這樣的查詢在oracle中需要用到row_number() over(partition by 分組的列 order by 排序的列)函式

舉例如下:

今天是5號

表a使用者 登陸的日期   使用者在表中用userid欄位表示 日期date

a            5

a            4

a            3

a            2

b            5

b            4

b            2

b            1

c            4

c            3

需要得到的結果是

使用者 連續登陸的天數

a            4

b            2

sql實現

select userid, date, row_number() over(partition by userid order by date desc) as rn   ---這裡按使用者分組 然後按date排序

from a

這個sql查出來的結果 就是

使用者 登陸的日期   rn

a            5             1        

a            4             2

a            3             3

a            2             4

b            5             1

b            4             2

b            2             3

b            1             4

c            4             1

c            3             2

做乙個處理,讓大家看的更清楚一些

使用者 登陸的日期   5-rn (用當天日期減去排序號)

a            5             4        

a            4             3

a            3             2

a            2             1

b            5             4

b            4             3

b            2             2

b            1             1

c            4             4

c            3             3

可以看出來 登陸的日期減去 (5-rn) = 1 就表明是連續登陸

我們繼續處理sql,把上面查出來的命名為表b

select userid, min(5-rn) from b where date - (5-rn) = 1 group by userid

取出最小的5-rn差值然後再用5減去就是連續的天數了

結果a    1

b    3

再用5去減

a    4

b    2

SQL 連續記錄查詢

1 題目要求輸出的時連續三行的記錄,則可以選擇三張單錶進行自關聯,連線的要求即為id序號的遞增。連線方式為left join 如下圖即為無要求時的連線語句及結果 有圖可知,連線的每一行的 id 時從s1 到s2遞增1,再到s3遞增1。再因為連線的每一行即為代表連續的三行的記錄。根據題目要求,則要求p...

SQL查詢出任意連續日期或時間

查詢一年十二個月 select case when length mon 1 then concat 0 mon else mon end months from select m m 1 mon from 表名稱隨便,select m 0 a aa limit 12 查詢出一天二十四小時 sele...

經典sql查詢語句

以下如果是數字型別的鍵值,就不應該加單引號。等於 select from persons where city beijing select from 要查詢的表名 where 鍵名 鍵值 不等於 select from persons where city beijing select from ...