having

The having clause specifies filtering conditions for groups or group members. It is always used after group by or context by clause.

If having is after group by, it is used with aggregate functions. The result is the rows of groups whose aggregate function values satisfy the specified conditions.

If having is after context by and is used with only aggregate functions, the result is the rows of the members of the groups whose aggregate function values satisfy the specified conditions.

If having is after context by and is used with a function that is not aggregate function, the result is the rows of the records that satisfy the specified conditions.

Examples

sym = `C`MS`MS`MS`IBM`IBM`C`C`C$SYMBOL
price= 49.6 29.46 29.52 30.02 174.97 175.23 50.76 50.32 51.29
qty = 2200 1900 2100 3200 6800 5400 1300 2500 8800
timestamp = [09:34:07,09:36:42,09:36:51,09:36:59,09:32:47,09:35:26,09:34:16,09:34:26,09:38:12]
t1 = table(timestamp, sym, qty, price);

t1;

timestamp

sym

qty

price

09:34:07

C

2200

49.6

09:36:42

MS

1900

29.46

09:36:51

MS

2100

29.52

09:36:59

MS

3200

30.02

09:32:47

IBM

6800

174.97

09:35:26

IBM

5400

175.23

09:34:16

C

1300

50.76

09:34:26

C

2500

50.32

09:38:12

C

8800

51.29

select sum(qty) as totalqty from t1 group by sym having sum(qty)>10000;

sym

totalqty

C

14800

IBM

12200

select * from t1 context by sym having count(sym)>2 and sum(qty)>10000;

timestamp

sym

qty

price

09:34:07

C

2200

49.6

09:34:16

C

1300

50.76

09:34:26

C

2500

50.32

09:38:12

C

8800

51.29

select * from t1 context by sym having rank(qty)>1;

timestamp

sym

qty

price

09:34:26

C

2500

50.32

09:38:12

C

8800

51.29

09:36:59

MS

3200

30.02

select * from t1 context by sym having rank(qty)>1 and sum(qty)>10000;

timestamp

sym

qty

price

09:34:26

C

2500

50.32

09:38:12

C

8800

51.29

The row filter in having is performed after calculating functions used in the select statement.

select *, min(qty) from t1 context by sym having rank(qty)>1;

timestamp

sym

qty

price

min_qty

09:34:26

C

2500

50.32

1300

09:38:12

C

8800

51.29

1300

09:36:59

MS

3200

30.02

1900

top clause can be used together with context by clause and having clause.

select top 2 * from t1 context by sym having sum(qty)>8000;

timestamp

sym

qty

price

09:34:07

C

2200

49.6

09:34:16

C

1300

50.76

09:32:47

IBM

6800

174.97

09:35:26

IBM

5400

175.23