SQL 질문 기록

질문 목록

다른

MySQL의 @ 및 @@ 기호

Mysql @ @ @@ 부호
Mysql @和@@

조인, 왼쪽 조인, 오른쪽 조인, 전체 외부 조인

MySQL 내부 조인, 왼쪽 및 오른쪽 외부 조인 그림

창 기능 연습

mysql 창 기능 연습

SQL 579 직원의 누적 급여 쿼리 어려움

여기에 이미지 설명을 삽입하세요.
여기에 이미지 설명을 삽입하세요.

SELECT 
    id, 
    Month,
    SUM(Salary) OVER(PARTITION BY id ORDER BY Month RANGE 2 PRECEDING) AS Salary
FROM
    Employee
WHERE 
    (id, Month) NOT IN (
        SELECT
            id,
            MAX(Month) AS Month
        FROM
            Employee
        GROUP BY 
            id
    )
ORDER BY
    id, Month DESC

SQL162 2021년 11월 일인당 기사 검색 시간

여기에 이미지 설명을 삽입하세요.
여기에 이미지 설명을 삽입하세요.

MySQL 날짜 관련 함수

mysql의 DATE 관련 함수 세부정보
MySQL SUBDATE() 사용법 및 코드 예
MySQL SUBDATE() 함수
MySQL DATE_SUB 및 SUBDATE 함수: 날짜 빼기 연산

MySQL 타임스탬프diff() 함수

시차 함수—TIMESTAMPDIFF()
[Mysql] TIMESTAMPDIFF 함수

MySQL date_format() 함수

MySQL DATE_FORMAT() 함수
date_format: 형식 날짜 날짜 함수
date_format의 공통 매개변수 설명:
%Y-%m-%d %H:%i:%s 2023-4-24 02:41:20

%a 缩写星期名 
%b 缩写月名 
%c 月,数值 
%D 带有英文前缀的月中的天 
%d 月的天,数值(00-31) 
%e 月的天,数值(0-31) 
%f 微秒 
%H 小时 (00-23) 
%h 小时 (01-12) 
%I 小时 (01-12) 
%i 分钟,数值(00-59) 
%j 年的天 (001-366) 
%k 小时 (0-23) 
%l 小时 (1-12) 
%M 月名 
%m 月,数值(00-12) 
%p AM 或 PM 
%r 时间,12-小时(hh:mm:ss AM 或 PM) 
%S 秒(00-59) 
%s 秒(00-59) 
%T 时间, 24-小时 (hh:mm:ss) 
%U 周 (00-53) 星期日是一周的第一天 
%u 周 (00-53) 星期一是一周的第一天 
%V 周 (01-53) 星期日是一周的第一天,与 %X 使用 
%v 周 (01-53) 星期一是一周的第一天,与 %x 使用 
%W 星期名 
%w 周的天 (0=星期日, 6=星期六) 
%X 年,其中的星期日是周的第一天,4 位,与 %V 使用 
%x 年,其中的星期一是周的第一天,4 位,与 %v 使用 
%Y 年,4%y 年,2
SELECT
    DATE (in_time) dt,
    ROUND(
        SUM(timestampdiff (second, in_time, out_time)) / COUNT(distinct uid),
        1
    ) avg_lensec
from
    tb_user_log
where
    date_format (in_time, "%Y-%m") = "2021-11"
    and artical_id != 0
group by
    dt
order by
    avg_lensec

각 비디오의 SQL156 평균 완료율

여기에 이미지 설명을 삽입하세요.
여기에 이미지 설명을 삽입하세요.
여기에 이미지 설명을 삽입하세요.

SQL 날짜 함수 day(), Month(), year()

SQL 날짜 함수 day(), Month(), year() 다양한 사용 방법

MySQL IF 문의 세 가지 용도

MySQL if 문의 세 가지 용도
여기에 이미지 설명을 삽입하세요.

MySQL의 count(1)과 count(*)의 차이점

MySQL sum(1) count(1) 사이의 차이점과 연결에 대해 간략히 설명합니다.
mysql에서 count(1)와 count(*) 사이의 차이점

MySQL SUM() 함수

mysql sum() 함수

MySQL 기능 사용법 FORMAT

MySQL 기능 사용법 FORMAT

SELECT
    a.video_id,
    ROUND(
        SUM(IF (end_time - start_time >= duration, 1, 0)) / COUNT(start_time),
        3
    ) AS avg_comp_play_rate
FROM
    tb_user_video_log a
    LEFT JOIN tb_video_info b ON a.video_id = b.video_id
WHERE
    YEAR (start_time) = 2021
GROUP BY
    a.video_id
ORDER BY
    avg_comp_play_rate DESC;

SQL157 평균 재생 진행률이 60%를 초과하는 비디오 카테고리

여기에 이미지 설명을 삽입하세요.
여기에 이미지 설명을 삽입하세요.
여기에 이미지 설명을 삽입하세요.

SELECT
    tag,
    CONCAT (avg_play_progress, "%") AS avg_play_progress
FROM
    (
        SELECT
            tag,
            ROUND(
                AVG(
                    IF (  
                        TIMESTAMPDIFF (SECOND, start_time, end_time) > duration,
                        1,
                        TIMESTAMPDIFF (SECOND, start_time, end_time) / duration
                    )
                ) * 100,
                2
            ) AS avg_play_progress
        FROM 
            tb_user_video_log
            JOIN tb_video_info USING (video_id)
        GROUP BY
            tag
        HAVING
            avg_play_progress > 60
        ORDER BY
            avg_play_progress DESC
    ) as t_progress

SQL180 특정 매장의 SPU 수

여기에 이미지 설명을 삽입하세요.

SELECT
    style_id,
    COUNT(DISTINCT item_id) AS SPU_num
FROM 
    product_tb
GROUP BY 
    style_id
ORDER BY 
    SPU_num DESC

문의

SQL 1873 단순 특별 보너스 계산

여기에 이미지 설명을 삽입하세요.

LIKE +% 나머지

SELECT 
    employee_id,
    IF(
        employee_id % 2 = 1 AND name NOT LIKE "M%",
        salary,
        0
    ) AS bonus
FROM
    employees
ORDER BY
    employee_id;

Mod 및 LEFT 기능

여기에 이미지 설명을 삽입하세요.

SELECT 
    employee_id,
    IF(
        MOD(employee_id, 2) = 1 AND LEFT(name, 1) != 'M',
        salary,
        0
    ) AS bonus
FROM
    employees
ORDER BY
    employee_id;

가지 구조의 CASE

여기에 이미지 설명을 삽입하세요.
여기에 이미지 설명을 삽입하세요.

SELECT 
    employee_id,
    CASE
        WHEN MOD(employee_id, 2) != 0 AND LEFT(name, 1) != 'M' THEN salary
        WHEN MOD(employee_id, 2) = 0 OR LEFT(name, 1) = 'M' THEN 0
        ELSE 0
    END AS bonus
FROM
    employees
ORDER BY
    employee_id;

REGEXP 키워드는 정규식을 지정합니다.

여기에 이미지 설명을 삽입하세요.

SELECT 
    employee_id,
    CASE
        WHEN MOD(employee_id, 2) = 1 AND name NOT REGEXP '^M' THEN salary 
        ELSE 0 
    END AS bonus 
FROM
    employees
ORDER BY
    employee_id;

SQL 1112 학생당 최고 성적 보통

여기에 이미지 설명을 삽입하세요.

윈도우 기능 - 정렬 기능

여기에 이미지 설명을 삽입하세요.

SELECT
    student_id,
    course_id,
    grade
FROM 
    (
        SELECT 
            student_id,
            course_id,
            grade,
            RANK() OVER (PARTITION BY student_id ORDER BY grade DESC, course_id ASC) AS ranking
        FROM
            enrollments
    ) t1
WHERE
    ranking = 1
ORDER BY
    student_id

SQL1398 A상품과 B상품을 구매했으나 C상품은 구매하지 않은 고객

여기에 이미지 설명을 삽입하세요.

MySQL SUM(1)과 SUM(0)의 차이점

MySQL SUM(1)과 SUM(0)의 차이점

SELECT
    o.customer_id,
    c.customer_name
FROM 
    orders o
    JOIN customers c ON o.customer_id = c.customer_id
GROUP BY
    customer_id
HAVING
    SUM(IF(product_name = 'A', 1, 0)) > 0 AND
    SUM(IF(product_name = 'B', 1, 0)) > 0 AND
    SUM(IF(product_name = 'C', 1, 0)) = 0

연결하다

SQL 607 영업사원 단순

여기에 이미지 설명을 삽입하세요.

SELECT
    name
FROM 
    salesperson s
WHERE 
    sales_id NOT IN (
        SELECT
            sales_id
        FROM 
            company c RIGHT JOIN orders o
            ON  c.com_id = o.com_id
        WHERE c.name = "RED"
    )

Simple을 판매하지 않은 SQL 1607 판매자

여기에 이미지 설명을 삽입하세요.

존재하지 않음/ IN이 아님/ LEFT JOIN 키워드

여기에 이미지 설명을 삽입하세요.
MySQL IN 및 NOT IN 사용법에 대한 자세한 설명
MySql에서 NOT IN 사용 시 주의사항

방법 1: NOT EXISTS 사용법이 익숙하지 않은 경우 내부 테이블과 외부 테이블에 대한 연결 조건을 사용해야 합니다. 외부 레이어에서는 내부 레이어에서 해당 레코드를 찾을 수 있습니다.

-- 使用 NOT EXISTS 来查找,所有销售日期中年份不等于 2020 的记录,注意 NOT EXISTS 需要使用连接字段
-- 将外层内层查询连接起来

SELECT
    seller_name
FROM
    seller s
WHERE NOT EXISTS(
    SELECT
        sale_date
    FROM 
        orders o
    WHERE
        DATE_FORMAT(sale_date, "%Y") = "2020"
        AND s.seller_id = o.seller_id
)
ORDER BY 
    seller_name

방법 2: 2020년에 판매한 직원을 필터링한 다음 외부 쿼리를 중첩하여 내부 목록에 없는 Seller_name을 필터링합니다.

-- 筛选出在 2020 年销售过的员工,然后嵌套外层查询筛选出不在内层名单的 seller_name

SELECT
    seller_name
FROM
    seller
WHERE
    seller_id NOT IN (
        SELECT
            DISTINCT o.seller_id
        FROM 
            orders o
        WHERE
            DATE_FORMAT(o.sale_date, "%Y") = "2020"
    )
ORDER BY
    seller_name

SQL 1407 최고의 여행자 단순

MySQL IFNULL() 함수

MySQL IFNULL() 함수
여기에 이미지 설명을 삽입하세요.

SELECT
    name,
    IFNULL(SUM(distance), 0) AS travelled_distance
FROM 
    users u LEFT JOIN
    rides r ON u.id = r.user_id
GROUP BY
    user_id
ORDER BY 
    travelled_distance DESC,
    name

SQL 1440 부울 표현식 매체 평가

왼쪽 조인 두 번

여기에 이미지 설명을 삽입하세요.

SELECT 
    e.left_operand,
    e.operator,
    e.right_operand,
    CASE WHEN (
        (e.operator = '=' AND v1.value = v2.value) OR
        (e.operator = '>' AND v1.value > v2.value) OR
        (e.operator = '<' AND v1.value < v2.value)
    ) THEN "true" ELSE "false"
    END AS value
FROM
    expressions e
    LEFT JOIN variables v1
    ON e.left_operand = v1.name
    LEFT JOIN variables v2
    ON e.right_operand = v2.name

SQL 1212 쿼리 팀 포인트 중간

UNION ALL + JOIN + 하위 쿼리

여기에 이미지 설명을 삽입하세요.
여기에 이미지 설명을 삽입하세요.

SELECT
    t.team_id, t.team_name, IFNULL(score, 0) num_points
FROM(
    SELECT team_id, SUM(score) score
    FROM(
        SELECT
            host_team team_id,
            SUM(CASE 
            WHEN host_goals > guest_goals THEN 3
            WHEN host_goals = guest_goals THEN 1
            ELSE 0
            END) score
        FROM 
            matches
        GROUP BY 
            host_team
        UNION ALL
        SELECT
            guest_team team_id,
            SUM(CASE 
            WHEN host_goals > guest_goals THEN 0
            WHEN host_goals = guest_goals THEN 1
            ELSE 3
            END) score
        FROM 
            matches
        GROUP BY 
            guest_team
    ) b
    GROUP BY
        team_id 
) a
RIGHT JOIN teams t ON t.team_id = a.team_id
ORDER BY num_points DESC, t.team_id

중합

SQL 1571 창고 관리자 단순

여기에 이미지 설명을 삽입하세요.

조인 + 집계 함수 SUM()

SELECT 
    w.name warehouse_name,
    SUM(w.units * p.width * p.length * p.height) VOLUME
FROM 
    warehouse w LEFT JOIN products p
    ON w.product_id = p.product_id
GROUP BY
    w.name

SQL 586 가장 많은 주문을 받은 고객 (중요!) Simple

여기에 이미지 설명을 삽입하세요.

LIMIT 및 COUNT() 함수 사용

SELECT
    customer_number
FROM
    orders
GROUP BY
    customer_number
ORDER BY
    COUNT(*) DESC
LIMIT 0, 1

DENSE_RANK() 창 함수 및 PARTITION BY 세부 정보 사용

586. 최다 주문 고객 (창순위 기능 내 PARTITION BY 상세 내용)

SELECT 
    customer_number
FROM
    (SELECT
        *,
        DENSE_RANK() OVER (ORDER BY COUNT(order_number) DESC) AS ranking
    FROM 
        orders
    GROUP BY 
        customer_number
    ) tmp
WHERE ranking = 1

SQL 1076 프로젝트 직원 II

창 전체 순위+개수

여기에 이미지 설명을 삽입하세요.

SELECT 
    project_id
FROM
    (SELECT
        project_id,
        DENSE_RANK() OVER (ORDER BY COUNT(*) DESC) AS ranking
    FROM 
        project
    GROUP BY 
        project_id
    ) tmp
WHERE ranking = 1

SQL 1082 판매 분석 I 단순

창 전체 순위 + 합계

여기에 이미지 설명을 삽입하세요.

SELECT 
    seller_id
FROM
    (
    SELECT
        seller_id,
        DENSE_RANK() OVER (ORDER BY SUM(price) DESC) AS ranking
    FROM 
        sales
    GROUP BY
        seller_id
    ) tmp
WHERE ranking = 1

SQL 176 두 번째로 높은 급여 보통

여기에 이미지 설명을 삽입하세요.

창 전체 순위+IFNULL

SELECT
    IFNULL(
        (SELECT 
            DISTINCT salary
        FROM
            (SELECT
                salary,
                DENSE_RANK() OVER (ORDER BY salary DESC) AS ranking
            FROM
                employee
            ) tmp
        WHERE ranking = 2),
        NULL
    ) AS SecondHighestSalary

가장 높은 응답률을 보이는 SQL 578 쿼리 질문 중간

여기에 이미지 설명을 삽입하세요.

윈도우 전체 순위 + 합계(if) 사용량 + 지표 계산

SELECT
    question_id survey_log
FROM 
    (SELECT
        question_id,
        DENSE_RANK() OVER (ORDER BY SUM(IF(action = "answer", 1, 0)) 
        / SUM(IF(action = "show", 1, 0 )) DESC) AS ranking
    FROM 
        surveylog
    GROUP BY
        question_id
    ) tmp
WHERE ranking = 1
ORDER BY question_id
LIMIT 0, 1

SQL 602 친구 응용 프로그램 II: 친구가 가장 많은 사람은 누구입니까?

여기에 이미지 설명을 삽입하세요.

창 종합 순위 + UNION ALL

SELECT 
    requester_id AS id,
    num
FROM
    (SELECT 
        requester_id,
        DENSE_RANK() OVER (ORDER BY COUNT(*) DESC) AS ranking,
        COUNT(*) AS num
    FROM
        (
        SELECT * FROM requestaccepted r1
        UNION
        SELECT
            accepter_id AS requester_id,
            requester_id AS accepter_id,
            accepter_id
        FROM requestaccepted r2
        ) t1
    GROUP BY
        requester_id
    ) t2
WHERE ranking = 1

SQL 1741 각 직원이 보낸 총 시간 찾기

여기에 이미지 설명을 삽입하세요.

GROUP BY를 두 번

SELECT 
    event_day AS day,
    emp_id,
    SUM(out_time - in_time) AS total_time
FROM 
    employees e
GROUP BY
    event_day, emp_id

SQL 1173 즉석음식배달 I

여기에 이미지 설명을 삽입하세요.

ROUND()는 소수점 이하 자릿수 기능을 유지합니다.

여기에 이미지 설명을 삽입하세요.

SELECT 
    ROUND(
        (SELECT COUNT(*) FROM delivery WHERE order_date = customer_pref_delivery_date) /
        (SELECT COUNT(*) FROM delivery) * 100,
        2
    ) AS immediate_percentage

정렬 및 그룹화

SQL 1587 은행 계좌 요약 II

여기에 이미지 설명을 삽입하세요.

SELECT 
    name,
    SUM(amount) AS balance
FROM 
    users u RIGHT JOIN transactions t
    ON u.account = t.account
GROUP BY
    t.account
HAVING
    SUM(amount) > 10000

SQL 1050 3회 이상 함께 작업한 배우 및 감독

여기에 이미지 설명을 삽입하세요.

SELECT 
    actor_id,
    director_id
FROM 
    actordirector ad
GROUP BY
    actor_id,
    director_id
HAVING 
    COUNT(*) >= 3

SQL 1511 소비자 주문 빈도 단순

MySQL LEFT() 함수

MySQL LEFT() 함수

HAVING, SUM IF

여기에 이미지 설명을 삽입하세요.

SELECT 
    customer_id,
    name
FROM 
    customers
WHERE
    customer_id IN(
        SELECT 
            customer_id
        FROM
            product p RIGHT JOIN orders o
            ON p.product_id = o.product_id
        GROUP BY 
            customer_id
        HAVING 
            SUM(IF(LEFT(order_date, 7) = '2020-06',  price * quantity, 0)) >= 100 AND
            SUM(IF(LEFT(order_date, 7) = '2020-07',  price * quantity, 0)) >= 100
    )

SQL 1693 일상적인 리더 및 파트너

개수(개별 xxx)

여기에 이미지 설명을 삽입하세요.

SELECT
    date_id,
    make_name,
    COUNT(DISTINCT lead_id) AS unique_leads,
    COUNT(DISTINCT partner_id) AS unique_partners
FROM
    dailysales d
GROUP BY 
    date_id,
    make_name

SQL 1501 안심하고 투자할 수 있는 국가 (중요) Medium

여기에 이미지 설명을 삽입하세요.

SUBSTR() 차단 문자열 함수

MySQL 문자열 작업

UNION+JOIN 작성방법

SELECT
    name as country
FROM 
    (SELECT caller_id AS call_id, duration FROM calls
    UNION ALL
    SELECT callee_id AS call_id, duration FROM calls
    ) a
    LEFT JOIN
    (SELECT id, c.name
    FROM person p LEFT JOIN country c
    ON LEFT(p.phone_number, 3) = c.country_code
    ) b
    ON call_id = id
GROUP BY 
    name
HAVING AVG(duration) > (SELECT AVG(duration) FROM calls)

고급 쿼리 및 조인

SQL 603 연속 공석

셀프 조인 JOIN 및 ABS() 사용

여기에 이미지 설명을 삽입하세요.
여기에 이미지 설명을 삽입하세요.
여기에 이미지 설명을 삽입하세요.


SELECT
    DISTINCT a.seat_id
FROM 
    cinema a JOIN cinema b
    ON abs(a.seat_id - b.seat_id) = 1 AND a.free = true AND b.free = true
ORDER BY
    a.seat_id;

SQL 1795 다양한 매장의 각 제품 가격

여기에 이미지 설명을 삽입하세요.

열에서 행으로

SELECT product_id, 'store1' store, store1 price FROM products WHERE store1 IS NOT NULL
UNION
SELECT product_id, 'store2' store, store2 price FROM products WHERE store2 IS NOT NULL
UNION
SELECT product_id, 'store3' store, store3 price FROM products WHERE store3 IS NOT NULL;

행에서 열로

여기에 이미지 설명을 삽입하세요.

SELECT 
  product_id,
  SUM(IF(store = 'store1', price, NULL)) 'store1',
  SUM(IF(store = 'store2', price, NULL)) 'store2',
  SUM(IF(store = 'store3', price, NULL)) 'store3' 
FROM
  Products1 
GROUP BY product_id ;

여기에 이미지 설명을 삽입하세요.

SQL 613 직선에서 가장 가까운 거리

여기에 이미지 설명을 삽입하세요.

ABS() 및 MIN() 함수 사용

여기에 이미지 설명을 삽입하세요.

SELECT
    MIN(ABS(p1.x - p2.x)) AS shortest
FROM
    point p1 JOIN point p2
    ON p1.x != p2.x
;

정보가 누락된 SQL 1965 직원

여기에 이미지 설명을 삽입하세요.

UNION 및 JOIN 사용

여기에 이미지 설명을 삽입하세요.
여기에 이미지 설명을 삽입하세요.
여기에 이미지 설명을 삽입하세요.

SELECT
    employee_id
FROM(
    SELECT employee_id FROM employees e
    UNION
    SELECT employee_id FROM salaries s
) t
WHERE
    employee_id NOT IN (
        SELECT 
            employee_id
        FROM 
            employees e JOIN salaries s
            USING(employee_id)
    )
ORDER BY
    employee_id

SQL 1264 페이지 권장 사항 매체

여기에 이미지 설명을 삽입하세요.

SELECT
    DISTINCT page_id recommended_page
FROM 
    likes
WHERE 
    user_id IN (
        SELECT
            user2_id
        FROM (
            SELECT user1_id, user2_id FROM friendship
            UNION ALL
            SELECT user2_id, user1_id FROM friendship
        ) t
        WHERE
            user1_id = 1
    ) AND page_id NOT IN (SELECT page_id FROM likes WHERE user_id = 1)

SQL 608 트리 노드 매체

여기에 이미지 설명을 삽입하세요.

SELECT
    id,
    CASE 
        WHEN COUNT(*) = 1 AND SUM(IF(p_id IS NULL, 1, 0)) = 0 THEN 'Leaf'
        WHEN COUNT(*) > 1 AND SUM(IF(p_id IS NULL, 1, 0)) = 0 THEN 'Inner'
        WHEN COUNT(*) >= 1 AND SUM(IF(p_id IS NULL, 1, 0)) > 0 THEN 'Root'
    END AS type
FROM(
    SELECT id, p_id FROM tree
    UNION ALL
    SELECT p_id, id FROM tree
) t
WHERE 
    id IS NOT NULL
GROUP BY
    id

SQL 534 게임플레이 분석 III 중간

여기에 이미지 설명을 삽입하세요.

창 집계 함수의 누적 합계

SELECT 
    player_id,
    event_date,
    SUM(games_played) OVER (PARTITION BY player_id ORDER BY event_date ASC) games_played_so_far
FROM 
    activity;

SQL 1783 그랜드 슬램 수 매체

여기에 이미지 설명을 삽입하세요.

전통적인 데카르트 곱

SELECT
    player_id,
    player_name,
    SUM(p.player_id = c.Wimbledon) + SUM(p.player_id = c.Fr_open) 
    + SUM(p.player_id = c.US_open) + SUM(p.player_id = c.Au_open) AS grand_slams_count
FROM 
    championships c JOIN players p
GROUP BY
    p.player_id
HAVING
    grand_slams_count > 0

SQL 1747 Leetflex 계정은 금지되어야 합니다

여기에 이미지 설명을 삽입하세요.

데카르트 곱, BETWEEN 키워드

MySQL 간의 사용법

SELECT
    DISTINCT a.account_id
FROM
    LogInfo a JOIN LogInfo b
WHERE
    a.account_id = b.account_id 
    AND a.ip_address != b.ip_address
    AND (a.logout BETWEEN b.login AND b.logout)

하위 쿼리

SQL 1303 팀원 수 찾기 (중요)

여기에 이미지 설명을 삽입하세요.

윈도우 함수 COUNT()

group by 문으로 인해 행 수가 단일 행으로 줄어드는 문제를 방지하려면 윈도우 기능을 사용하는 것이 좋습니다.

SELECT
    employee_id,
    COUNT(employee_id) OVER(PARTITION BY team_id) AS team_size
FROM
    Employee

고급 주제: 창 함수 및 CTE(공용 테이블 표현식)

MySQL 공통 테이블 표현식(CTE)

MySQL 공통 테이블 표현식(CTE)
MySQL CTE(공통 테이블 표현식)

SQL 1077. 프로젝트 직원 III 중간

여기에 이미지 설명을 삽입하세요.

윈도우 순위 기능, CTE

WITH cte AS(
    SELECT
        p.project_id,
        e.employee_id,
        DENSE_RANK() OVER (PARTITION BY p.project_id ORDER BY e.experience_years DESC) AS ranking
    FROM 
        Project p JOIN Employee e
        USING(employee_id)
)

SELECT
    project_id,
    employee_id
FROM 
    cte
WHERE
    ranking = 1

SQL 1285 연속 범위의 시작 및 끝 번호 찾기

여기에 이미지 설명을 삽입하세요.

연속 간격 및 창 함수 ROW_NUMBER()

여기에 이미지 설명을 삽입하세요.

SELECT
    MIN(log_id) start_id,
    MAX(log_id) end_id
FROM
    (SELECT
        log_id,
        log_id - ROW_NUMBER() OVER() AS diff
    FROM 
        Logs
    ) t
GROUP BY
    diff

SQL 1596 고객당 가장 자주 주문되는 품목(중요)

여기에 이미지 설명을 삽입하세요.

PARTITION BY + ORDER BY + 외부 GROUP BY + COUNT()

SELECT 
    customer_id,
    product_id,
    product_name
FROM
    (SELECT
        customer_id,
        product_id,
        product_name,
        DENSE_RANK() OVER (PARTITION BY customer_id ORDER BY COUNT(*) DESC) AS ranking
    FROM
        Orders o JOIN Products p
        USING(product_id)
    GROUP BY
        customer_id, product_id
    ) t
WHERE
    ranking = 1

SQL 1709 액세스 날짜 사이의 최대 간격 기간

여기에 이미지 설명을 삽입하세요.

LEAD() 함수 및 LAG() 함수

MySQL의 LAG() 함수, LEAD() 함수 사용법
MYSQL lag(), Lead() 함수 사용법

SELECT
    user_id,
    MAX(TIMESTAMPDIFF(DAY, visit_date, next_day)) AS biggest_window
FROM
    (SELECT
        user_id,
        visit_date,
        LEAD(visit_date, 1, "2021-1-1") OVER (PARTITION BY user_id ORDER BY visit_date ASC) AS next_day
    FROM 
        UserVisits
    ) t
GROUP BY
    user_id
ORDER BY 
    user_id

SQL 1270 회사의 CEO에게 보고하는 모든 사람

여기에 이미지 설명을 삽입하세요.

방법 1: UNION ALL, 하위 쿼리

여기에 이미지 설명을 삽입하세요.

SELECT DISTINCT employee_id FROM (
    SELECT employee_id
    FROM Employees WHERE manager_id = 1
    UNION ALL
    SELECT employee_id
    FROM Employees WHERE manager_id IN (
        SELECT employee_id FROM Employees WHERE manager_id = 1
    )
    UNION ALL
    SELECT employee_id
    FROM Employees WHERE manager_id IN (
        SELECT employee_id FROM Employees WHERE manager_id IN (
            SELECT employee_id FROM Employees WHERE manager_id = 1
        )
    )
) T WHERE employee_id != 1

방법 2: 가입

여기에 이미지 설명을 삽입하세요.

SELECT 
	e1.employee_id
FROM 
	Employees e1 JOIN Employees e2 
	ON e1.manager_id = e2.employee_id
	JOIN Employees e3 
	ON e2.manager_id = e3.employee_id
WHERE 
	e1.employee_id != 1 AND e3.manager_id = 1

SQL 1412 난이도가 중간 수준인 학생 찾기

여기에 이미지 설명을 삽입하세요.

밀도_순위()

Windowing 기능은 결과를 위쪽으로 정렬한 다음 뒤쪽으로 정렬합니다. 두 열 모두 1이 아닌 한 중앙에 있습니다.

WITH cte AS(
    SELECT 
        student_id,
        IF(DENSE_RANK() OVER (PARTITION BY exam_id ORDER BY score DESC) = 1, 1, 0) AS d_rank,
        IF(DENSE_RANK() OVER (PARTITION BY exam_id ORDER BY score) = 1, 1, 0) AS a_rank
    FROM 
        Exam
)

SELECT
    student_id,
    student_name
FROM
    Student s JOIN cte
    USING(student_id)
GROUP BY
    student_id
HAVING
    SUM(d_rank) = 0 AND SUM(a_rank) = 0
ORDER BY
    student_id

SQL 1767 실행되지 않은 작업 쌍을 찾는 것이 어렵습니다.

CTE 재귀

여기에 이미지 설명을 삽입하세요.

WITH RECURSIVE cte(task_id, subtask_id) AS (
    SELECT task_id, subtasks_count FROM Tasks
    UNION
    SELECT task_id, subtask_id - 1 FROM cte WHERE subtask_id > 1
)

SELECT 
    task_id,
    subtask_id
FROM
    cte LEFT JOIN Executed e
    USING (task_id, subtask_id)
WHERE 
    e.subtask_id IS NULL
ORDER BY 
    task_id, subtask_id

SQL 1225 연속 날짜의 시스템 상태 보고 어려움

여기에 이미지 설명을 삽입하세요.

차이 diff, SUBDATE() 날짜 함수를 사용한 연속 간격

SELECT
    tktype AS period_state,
    MIN(date_time) AS start_date,
    MAX(date_time) AS end_date
FROM
(
    SELECT
        tktype,
        date_time,
        SUBDATE(date_time, INTERVAL ROW_NUMBER() OVER (PARTITION BY tktype ORDER BY date_time) DAY) AS diff
    FROM
    (
        SELECT
            'failed' tktype,
            fail_date date_time
        FROM
            Failed
        UNION ALL
        SELECT
            'succeeded' tktype,
            success_date date_time
        FROM 
            Succeeded
    ) t1
) t2
WHERE
    date_time BETWEEN "2019-01-01" AND "2019-12-31"
GROUP BY
    tktype, diff
ORDER BY
    start_date

SQL136 시험 유형별 상위 3개 점수 중간

여기에 이미지 설명을 삽입하세요.

ROW_NUMBER(), PARTITION BY, GROUP BY

여기에 이미지 설명을 삽입하세요.

SELECT 
    tag,
    uid,
    ranking
FROM
    (SELECT
        b.tag,
        a.uid,
        ROW_NUMBER() OVER (PARTITION BY tag ORDER BY MAX(a.score) DESC, MIN(a.score) DESC, a.uid DESC) AS ranking
    FROM
        exam_record a LEFT JOIN examination_info b 
        ON a.exam_id = b.exam_id
    GROUP BY
        b.tag, a.uid
    ) t
WHERE 
    ranking <= 3

SQL137 난이도 두 번째로 빠른/느린 시간 차이가 시험지 길이의 절반보다 깁니다.

여기에 이미지 설명을 삽입하세요.

TIMESTAMPDIFF()、ROW_NUMBER()、CASE WHEN

여기에 이미지 설명을 삽입하세요.

SELECT 
    exam_id,
    duration,
    release_time
FROM
    (
        SELECT
            exam_id,
            duration,
            release_time,
            SUM(
                CASE
                    WHEN rank1 = 2 THEN costtime
                    WHEN rank2 = 2 THEN -costtime
                    ELSE 0
                END
            ) AS sub
        FROM
            (
                SELECT
                    e_i.exam_id,
                    duration, 
                    release_time,
                    TIMESTAMPDIFF(MINUTE, start_time, submit_time) AS costtime,
                    ROW_NUMBER() OVER (
                        PARTITION BY e_r.exam_id 
                        ORDER BY TIMESTAMPDIFF(MINUTE, start_time, submit_time) DESC
                    ) AS rank1,
                    ROW_NUMBER() OVER (
                        PARTITION BY e_r.exam_id 
                        ORDER BY TIMESTAMPDIFF(MINUTE, start_time, submit_time) ASC
                    ) AS rank2
                FROM 
                    exam_record e_r LEFT JOIN examination_info e_i
                    ON e_r.exam_id = e_i.exam_id
                WHERE 
                    submit_time IS NOT NULL
            ) t1
        GROUP BY
            exam_id
    ) t2
WHERE 
    sub * 2 >= duration
ORDER BY    
    exam_id DESC

SQL138 난이도 시험지를 연속으로 두 번 답할 수 있는 최대 시간 창

여기에 이미지 설명을 삽입하세요.
여기에 이미지 설명을 삽입하세요.
여기에 이미지 설명을 삽입하세요.

WITH t2 AS(
    SELECT 
        uid,
        COUNT(start_time) AS total, -- 用户2021年作答的次数
        DATEDIFF(MAX(start_time), MIN(start_time)) + 1 AS diff_time, -- 头尾作答时间窗
        MAX(DATEDIFF(next_time, start_time)) + 1 AS days_window -- 最大间隔天数
    FROM
        (
            SELECT
                uid,
                start_time,
                LEAD(start_time, 1) OVER (PARTITION BY uid ORDER BY start_time) AS next_time -- 第二次作答时间
            FROM 
                exam_record
            WHERE 
                YEAR(start_time) = 2021
        ) t1
    GROUP BY
        uid
)

SELECT
    uid,
    days_window,
    ROUND(total * days_window / diff_time, 2) AS avg_exam_cnt
FROM 
    t2
WHERE 
    diff_time > 1
ORDER BY 
    days_window DESC, avg_exam_cnt DESC

추천

출처blog.csdn.net/weixin_44123362/article/details/130279387