真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

MySQL中怎么實(shí)現(xiàn)一個(gè)分析函數(shù)

本篇文章為大家展示了MySQL中怎么實(shí)現(xiàn)一個(gè)分析函數(shù),內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

成都創(chuàng)新互聯(lián)公司2013年至今,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都做網(wǎng)站、網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元渝中做網(wǎng)站,已為上家服務(wù),為渝中各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:13518219792

1. 實(shí)現(xiàn)rownum

1

2

SET @rn:=0;

SELECT @rn:=@rn+1 AS rownum ,e.* FROM emp e;

MySQL中怎么實(shí)現(xiàn)一個(gè)分析函數(shù)

或者寫成:

1

SELECT @rn:=@rn + 1 AS rownum ,e.* FROM emp e ,(SELECT @rn:=0) c

2. 各種分析函數(shù)寫法 (MySQL實(shí)現(xiàn)分析語(yǔ)句時(shí)可能遇到的各種計(jì)算問題)

2.1 sum() 實(shí)現(xiàn)

--SQL 執(zhí)行順序 ,FROM ,JOIN ,WHERE ,GROUP BY,HAVING ,ORDER BY ,SELECT,

在Oracle中分頁(yè)語(yǔ)句的原始語(yǔ)句如下:

1

SELECT E.*, SUM(SAL) OVER(PARTITION BY DEPTNO) AS COUNTOVER FROM EMP E;

MySQL中怎么實(shí)現(xiàn)一個(gè)分析函數(shù)

1

2

3

4

5

6

7

8

SELECT E.*,

   (SELECT SUMOVER

      FROM (SELECT DEPTNO, SUM(SAL) AS SUMOVER

              FROM EMP E1

             GROUP BY DEPTNO) X

     WHERE X.DEPTNO = E.DEPTNO) AS COUNTOVER

FROM EMP E

ORDER BY DEPTNO;

MySQL中怎么實(shí)現(xiàn)一個(gè)分析函數(shù)

Mysql中也是這么實(shí)現(xiàn)的:

1

2

3

4

5

6

7

8

SELECT E.*,

   (SELECT SUMOVER

      FROM (SELECT DEPTNO, SUM(SAL) AS SUMOVER

              FROM emp E1

             GROUP BY DEPTNO) X

     WHERE X.DEPTNO = E.DEPTNO) AS COUNTOVER

FROM emp E

ORDER BY DEPTNO;

MySQL中怎么實(shí)現(xiàn)一個(gè)分析函數(shù)

2.2 row_number () 實(shí)現(xiàn)

1

2

select 

e.* ,row_number() over(partition by deptno order by empno) as ROW_NUMBER from emp e;

MySQL中怎么實(shí)現(xiàn)一個(gè)分析函數(shù)

我們的默認(rèn)規(guī)則是在from后初始化變量。

1

2

3

4

5

SELECT E.*,

   IF(@DEPTNO = DEPTNO, @RN := @RN + 1, @RN := 1) AS ROW_NUMBER,

   @DEPTNO := DEPTNO AS VAR1

FROM EMP E, (SELECT @DEPTNO := '', @RN := 0) C

ORDER BY DEPTNO;

MySQL中怎么實(shí)現(xiàn)一個(gè)分析函數(shù)

1

2

3

4

5

SELECT E.*,

   IF(@DEPTNO = DEPTNO, @RN := @RN + 1, @RN := 1) AS ROW_NUMBER,

   @DEPTNO := DEPTNO AS VAR1

FROM EMP E, (SELECT @DEPTNO := '', @RN := 0) C

ORDER BY DEPTNO;

這個(gè)語(yǔ)句首先執(zhí)行order by 

MySQL中怎么實(shí)現(xiàn)一個(gè)分析函數(shù)

2.3 求每個(gè)人員占他所在部門總工資的百分比

在Oracle中實(shí)現(xiàn):

1

2

3

4

SELECT E.*,

   TRUNC(SAL / SUM(SAL) OVER(PARTITION BY DEPTNO), 3) AS SALPERCENT

FROM EMP E

ORDER BY DEPTNO;

MySQL中怎么實(shí)現(xiàn)一個(gè)分析函數(shù)

1

2

3

4

5

6

7

8

SELECT E.*,

   SAL / (SELECT SUMOVER

            FROM (SELECT DEPTNO, SUM(SAL) AS SUMOVER

                    FROM emp E1

                   GROUP BY DEPTNO) X

           WHERE X.DEPTNO = E.DEPTNO) AS SalPercent

FROM emp E

ORDER BY DEPTNO;

MySQL中怎么實(shí)現(xiàn)一個(gè)分析函數(shù)

2.4 求各個(gè)部門的總共工資

Oracle:

1

SELECT e.* ,SUM(sal) OVER(PARTITION BY deptno) FROM emp e;

MySQL中怎么實(shí)現(xiàn)一個(gè)分析函數(shù)

MySQL: 

1

2

3

4

5

6

7

8

9

SELECT A.*,

   ROUND(CAST(IF(@DEPTNO = DEPTNO, @MAX := @MAX, @MAX := SUMOVER) AS CHAR ),0) AS SUMOVER2,

   @DEPTNO := DEPTNO AS VAR2

FROM (SELECT E.*,

           IF(@DEPTNO = DEPTNO, @SUM := @SUM + SAL, @SUM := SAL) AS SUMOVER,

           @DEPTNO := DEPTNO AS VAR1

      FROM emp E, (SELECT @DEPTNO := '', @SUM := 0, @MAX := 0) C

     ORDER BY DEPTNO) A

ORDER BY DEPTNO, SUMOVER DESC;

子查詢的功能實(shí)現(xiàn)如下: 

MySQL中怎么實(shí)現(xiàn)一個(gè)分析函數(shù)

下面是這個(gè)語(yǔ)句的結(jié)果

MySQL中怎么實(shí)現(xiàn)一個(gè)分析函數(shù)

2.5 拿部門第二的工資的人

首先我們拿第二名的,用Oracle很好實(shí)現(xiàn),不論是第一還是第二。

1

2

3

4

5

SELECT *

FROM (SELECT E.*,

           ROW_NUMBER() OVER(PARTITION BY DEPTNO ORDER BY SAL DESCAS RN

      FROM EMP E)

WHERE RN = 2;

MySQL中怎么實(shí)現(xiàn)一個(gè)分析函數(shù)

Mysql中第一這么實(shí)現(xiàn):

在5.6版本,sql_mode非only_full_group_by的情況,我們可以使用如下方式實(shí)現(xiàn)

1

set global sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

1

SELECT FROM (SELECT e.* FROM emp e ORDER BY deptno,sal ) a GROUP BY deptno;

在SQL_MODE非only_full_group_by時(shí),MySQL中的group by是只取第一行的,下面我們看取第二行的SQL。 

1

2

3

4

5

6

7

SELECT *

FROM (SELECT E.*,

           IF(@DEPTNO = DEPTNO, @RN := @RN + 1, @RN := 1) AS RN,

           @DEPTNO := DEPTNO

      FROM EMP E, (SELECT @RN := 0, @DEPTNO := 0) C

     ORDER BY DEPTNO, SAL DESC) X

WHERE X.RN = 2;

MySQL中怎么實(shí)現(xiàn)一個(gè)分析函數(shù)

2.6 dense_rank()

dense_rank函數(shù)返回一個(gè)唯一的值,除非當(dāng)碰到相同數(shù)據(jù)時(shí),此時(shí)所有相同數(shù)據(jù)的排名都一樣。

1

2

3

4

5

6

7

SELECT empno,

ename,

sal,

deptno,

rank() OVER(PARTITION BY deptno ORDER BY sal descas rank,

dense_rank() OVER(PARTITION BY deptno ORDER BY sal descas dense_rank

FROM emp e;

MySQL中怎么實(shí)現(xiàn)一個(gè)分析函數(shù)

MySQL的寫法:

1

2

3

4

5

6

7

8

select 

empno,ename,sal,deptno, 

if(@deptno = deptno,if(@sal=sal,@rn:=@rn,@rn3:=@rn3+1),@rn:=1) as "RANK() OVER"

if(@sal =sal,@rn2:=@rn2 ,if(@deptno = deptno,@rn2:=@rn2+1,@rn2:=1)) as "DENSE_RANK() OVER"

if(@deptno = deptno,@rn:=@rn+1,@rn:=1) as "ROW_NUMBER() OVER" 

, @deptno:=deptno,@sal:=sal 

from 

(select empno,ename,sal,deptno from emp a ,(select @rn:=1,@deptno:=0,@rn2:=0,@rn3:=0,@sal:=0,@i:=0) b order by deptno,sal desc) c;

MySQL中怎么實(shí)現(xiàn)一個(gè)分析函數(shù)

2.7 連續(xù)獲得冠軍的有哪些

--請(qǐng)寫出一條SQL語(yǔ)句,查詢出在此期間連續(xù)獲得冠軍的有哪些,其連續(xù)的年份的起止時(shí)間是多少,結(jié)果如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

create table  nba as 

SELECT '公牛' AS TEAM, '1991' AS FROM DUAL UNION ALL

SELECT '公牛' AS TEAM, '1992' AS FROM DUAL UNION ALL

SELECT '公牛' AS TEAM, '1993' AS FROM DUAL UNION ALL

SELECT '活塞' AS TEAM, '1990' AS FROM DUAL UNION ALL

SELECT '火箭' AS TEAM, '1994' AS FROM DUAL UNION ALL

SELECT '火箭' AS TEAM, '1995' AS FROM DUAL UNION ALL

SELECT '公牛' AS TEAM, '1996' AS FROM DUAL UNION ALL

SELECT '公牛' AS TEAM, '1997' AS FROM DUAL UNION ALL

SELECT '公牛' AS TEAM, '1998' AS FROM DUAL UNION ALL

SELECT '馬刺' AS TEAM, '1999' AS FROM DUAL UNION ALL

SELECT '湖人' AS TEAM, '2000' AS FROM DUAL UNION ALL

SELECT '湖人' AS TEAM, '2001' AS FROM DUAL UNION ALL

SELECT '湖人' AS TEAM, '2002' AS FROM DUAL UNION ALL

SELECT '馬刺' AS TEAM, '2003' AS FROM DUAL UNION ALL

SELECT '活塞' AS TEAM, '2004' AS FROM DUAL UNION ALL

SELECT '馬刺' AS TEAM, '2005' AS FROM DUAL UNION ALL

SELECT '熱火' AS TEAM, '2006' AS FROM DUAL UNION ALL

SELECT '馬刺' AS TEAM, '2007' AS FROM DUAL UNION ALL

SELECT '凱爾特人' AS TEAM, '2008' AS FROM DUAL UNION ALL

SELECT '湖人' AS TEAM, '2009' AS FROM DUAL UNION ALL

SELECT '湖人' AS TEAM, '2010' AS FROM DUAL;

Oracle實(shí)現(xiàn):

1

2

3

4

5

6

7

8

9

10

SELECT TEAM, MIN(Y), MAX(Y)

FROM (SELECT E.*,

           ROWNUM,

           ROW_NUMBER() OVER(PARTITION BY TEAM ORDER BY Y) AS RN,

           ROWNUM - ROW_NUMBER() OVER(PARTITION BY TEAM ORDER BY Y) AS DIFF

      FROM NBA E

     ORDER BY Y)

GROUP BY TEAM, DIFF

HAVING MIN(Y) != MAX(Y)

ORDER BY 2;

MySQL實(shí)現(xiàn): 

1

2

3

4

5

6

7

8

9

10

SELECT TEAM, MIN(Y), MAX(Y)

FROM (SELECT TEAM,

           Y,

           IF(@TEAM = TEAM, @RN := @RN + 1, @RN := 1) AS RWN,

           @RN1 := @RN1 + 1 AS RN,

           @TEAM := TEAM

      FROM nba N, (SELECT @RN := 0, @TEAM := '', @RN1 := '') C) A

GROUP BY RN - RWN

HAVING MIN(Y) != MAX(Y)

ORDER BY 2

MySQL中怎么實(shí)現(xiàn)一個(gè)分析函數(shù)

| UDF插件

Userdefined Function,用戶定義函數(shù)。我們知道,MySQL本身支持很多內(nèi)建的函數(shù),此外還可以通過創(chuàng)建存儲(chǔ)方法來定義函數(shù)。UDF為用戶提供了一種更高效的方式來創(chuàng)建函數(shù)。

UDF與普通函數(shù)類似,有參數(shù),也有輸出。分為兩種類型:?jiǎn)未握{(diào)用型和聚集函數(shù)。前者能夠針對(duì)每一行數(shù)據(jù)進(jìn)行處理,后者則用于處理Group By這樣的情況。

UDF自定義函數(shù),在MySQL basedir/include

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

[root@test12c include]# pwd

/usr/local/mysql/include

[root@test12c include]# cat rownum.c 

#include 

#include 

#if defined(MYSQL_SERVER)

#include         /* To get strmov() */

#else

/* when compiled as standalone */

#include 

#define strmov(a,b) stpcpy(a,b)

#endif

#include 

#include 

/*

gcc -fPIC -Wall -I/usr/local/mysql/include -I. -shared rownum.c -o rownum.so

DROP FUNCTION IF EXISTS rownum;

CREATE FUNCTION rownum RETURNS INTEGER SONAME 'rownum.so';

*/

C_MODE_START;

my_bool rownum_init(UDF_INIT *initid, UDF_ARGS *args, char *message);

void rownum_deinit(UDF_INIT *initid);

chong rownum(UDF_INIT *initid, UDF_ARGS *args, char *is_null,char *error);

C_MODE_END;

/*

Simple example of how to get a sequences starting from the first argument

or 1 if no arguments have been given

*/

my_bool rownum_init(UDF_INIT *initid, UDF_ARGS *args, char *message)

{

if (args->arg_count > 1)

{

strmov(message,"This function takes none or 1 argument");

return 1;

}

if (args->arg_count)

args->arg_type[0]= INT_RESULT;        /* Force argument to int */

if (!(initid->ptr=(char*) malloc(sizeof(chong))))

{

strmov(message,"Couldn't allocate memory");

return 1;

}

memset(initid->ptr, 0, sizeof(chong));

initid->const_item=0;

return 0;

}

void rownum_deinit(UDF_INIT *initid)

{

if (initid->ptr)

free(initid->ptr);

}

chong rownum(UDF_INIT *initid __attribute__((unused)), UDF_ARGS *args,char *is_null __attribute__((unused)),char *error __attribute__((unused)))

{

uchong val=0;

if (args->arg_count)

val= *((chong*) args->args[0]);

return ++*((chong*) initid->ptr) + val;

}

生成動(dòng)態(tài)鏈接庫(kù)

1

gcc rownum.c -fPIC -shared -o ../lib/plugin/rownum.so

MySQL中怎么實(shí)現(xiàn)一個(gè)分析函數(shù)

MySQL中怎么實(shí)現(xiàn)一個(gè)分析函數(shù)

上述內(nèi)容就是MySQL中怎么實(shí)現(xiàn)一個(gè)分析函數(shù),你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


網(wǎng)頁(yè)題目:MySQL中怎么實(shí)現(xiàn)一個(gè)分析函數(shù)
瀏覽路徑:http://weahome.cn/article/gohcis.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部