-- example
-- JOINS
SELECT * from a;
SELECT t1.c1, t2.c2 FROM t1 JOIN t2
  ON t1.id = t2.id and t1.type_flag = t2.type_flag
  WHERE t1.c1 > 100;

SELECT t1.c1, t2.c2 FROM t1 JOIN t2
  USING (id, type_flag)
  WHERE t1.c1 > 100;

SELECT t1.c1, t2.c2 FROM t1, t2
  WHERE
  t1.id = t2.id AND t1.type_flag = t2.type_flag
  AND t1.c1 > 100;

SELECT lhs.id, rhs.parent, lhs.c1, rhs.c2 FROM tree_data lhs, tree_data rhs WHERE lhs.id = rhs.parent;

SELECT t1.id, c1, c2 FROM t1, t2 WHERE t1.id = t2.id;

SELECT t1.id, c1, c2 FROM t1 JOIN t2 ON t1.id = t2.id;

SELECT t1.id, c1, c2 FROM t1 INNER JOIN t2 ON t1.id = t2.id;

SELECT * FROM t1 LEFT OUTER JOIN t2 ON t1.id = t2.id;

SELECT * FROM t1 RIGHT OUTER JOIN t2 ON t1.id = t2.id;

SELECT * FROM t1 FULL OUTER JOIN t2 ON t1.id = t2.id;

SELECT * FROM t1 CROSS JOIN t2 WHERE t1.total > t2.maximum_price;

SELECT * FROM t1 LEFT OUTER JOIN t2 ON t1.int_col < t2.int_col;

SELECT t1.c1, t1.c2, t1.c2 FROM t1 LEFT SEMI JOIN t2 ON t1.id = t2.id;

select t1.c1 as first_id, t2.c2 as second_id from
  t1 join t2 on first_id = second_id;

select fact.custno, dimension.custno from
  customer_data as fact join customer_address as dimension
  using (custno);

-- ORDER BY
SELECT id FROM games ORDER BY score DESC;

SELECT id, item FROM games, games.score
  WHERE item > 1000000
ORDER BY id, item desc;

SELECT id, info.key1 AS k, info.value1 AS v from games3, games3.play AS plays, games3.item AS info
  WHERE info.KEY1 = 'score' AND info.VALUE1 > 1000000
ORDER BY id, info.value1 desc;

SELECT user_id AS "Top 10 Visitors", SUM(page_views) FROM web_stats
  GROUP BY page_views, user_id
  ORDER BY SUM(page_views) DESC LIMIT 10;

SELECT page_title AS "Page 3 of search results", page_url FROM search_content
  WHERE LOWER(page_title) LIKE '%game%'
  ORDER BY page_title LIMIT 10 OFFSET 20;

select x from numbers order by x desc nulls last;

-- GROUP BY
select
  ss_item_sk as Item,
  count(ss_item_sk) as Times_Purchased,
  sum(ss_quantity) as Total_Quantity_Purchased
from store_sales
  group by ss_item_sk
  order by sum(ss_quantity) desc
  limit 5;

select
  ss_item_sk as Item,
  count(ss_item_sk) as Times_Purchased,
  sum(ss_quantity) as Total_Quantity_Purchased
from store_sales
  group by ss_item_sk
  having times_purchased >= 100
  order by sum(ss_quantity)
  limit 5;

select ss_wholesale_cost, avg(ss_quantity * ss_sales_price) as avg_revenue_per_sale
  from sales
  group by ss_wholesale_cost
  order by avg_revenue_per_sale desc
  limit 5;

select x as "Top 3" from numbers order by x desc limit 3;

SELECT X FROM T1 LIMIT LENGTH('HELLO WORLD');
SELECT x FROM t1 LIMIT cast(truncate(9.9) AS INT);

-- UNION
select * from (select x from few_ints union all select x from few_ints) as t1 order by x;

-- Subqueries
SELECT employee_name, employee_id FROM employees one WHERE
  salary > (SELECT avg(salary) FROM employees two WHERE one.dept_id = two.dept_id);

SELECT avg(t1.x), max(t2.y) FROM
  (SELECT id, cast(a AS DECIMAL(10,5)) AS x FROM raw_data WHERE a BETWEEN 0 AND 100) AS t1
  JOIN
  (SELECT id, length(s) AS y FROM raw_data WHERE s LIKE 'A%') AS t2
  USING (id);

SELECT count(x) FROM t1 WHERE EXISTS(SELECT 1 FROM t2 WHERE t1.x = t2.y * 10);

SELECT x FROM t1 WHERE x IN (SELECT y FROM t2 WHERE state = 'CA');

SELECT x FROM t1 WHERE y = (SELECT max(z) FROM t2);

SELECT x FROM t1 WHERE y > (SELECT count(z) FROM t2);

SELECT * FROM t1 one WHERE id IN (SELECT parent FROM t1 two WHERE t1.parent = t2.id);

-- TABLESAMPLE
select distinct x from sample_demo tablesample system(50);

select distinct x from sample_demo
  tablesample system(50) repeatable (12345);

select count(*) from sample_demo_partitions
  tablesample system(50) where n = 1;

-- WITH
with t1 as (select 1), t2 as (select 2) insert into tab select * from t1 union all select * from t2;

-- DISTINCT
SELECT COUNT(DISTINCT c_salutation, c_last_name) FROM customer;

SELECT DISTINCT c_salutation, c_last_name FROM customer;

-- OTHERS
select
  r_name,
  count(r_nations.item.n_nationkey) as count,
  sum(r_nations.item.n_nationkey) as sum,
  avg(r_nations.item.n_nationkey) as avg,
  min(r_nations.item.n_name) as minimum,
  max(r_nations.item.n_name) as maximum,
  ndv(r_nations.item.n_nationkey) as distinct_vals
from
  region, region.r_nations as r_nations
group by r_name
order by r_name;

select "contains an even number" as assertion from t3 where exists (select z from t3 where z % 2 = 0) limit 1;

select null is distinct from null, null != null;

select
  'x' is distinct from 'x ' as string_with_trailing_spaces,
  cast('x' as char(5)) is distinct from cast('x ' as char(5)) as char_with_trailing_spaces;

select c_first_name, c_last_name from customer where c_first_name regexp '^J.*';

SELECT
    t1.transaction_id as transaction_id1,
    t1.customer_id,
    t1.transaction_date,
    t1.transaction_amount,
    t2.transaction_id as subsequent_transaction_id
FROM
    transactions t1
    LEFT JOIN (
        SELECT
            transaction_id,
            customer_id,
            transaction_date,
            transaction_amount,
            LEAD (transaction_id) OVER (
                PARTITION BY
                    customer_id
                ORDER BY
                    transaction_date
            ) AS transaction_id
        FROM
            transactions
    ) t2 ON t1.transaction_id = t2.transaction_id
    AND t1.customer_id = t2.customer_id
    AND t1.transaction_date = t2.transaction_date
    AND t1.transaction_amount = t2.transaction_amount;

select appx_median(x) from million_numbers;

select count(x) as higher from million_numbers where x > (select appx_median(x) from million_numbers);

select avg(length(s)) from t1;

select 'fooBar' ilike 'FOOBAR';

select 'ABCXYZ' not ilike 'ab_xyz';

select 1 not in (1,null,2,3);

SELECT c1 AS "starts with vowel" FROM t2 WHERE upper(substr(c1,1,1)) IN ('A','E','I','O','U');

select 'abcABCaabbcc' iregexp '^[a-c]+$';

select null is distinct from null, null != null;

select
  'x' is distinct from 'x ' as string_with_trailing_spaces,
  cast('x' as char(5)) is distinct from cast('x ' as char(5)) as char_with_trailing_spaces;

select assertion, b, b is true, b is false, b is unknown
  from boolean_test;

select true and null;

select c_first_name, c_last_name from customer where lower(trim(c_last_name)) regexp '^de.*';

select c_first_name, c_last_name from customer where lower(trim(c_last_name)) rlike '^de.*';