수색…
모든 행에 선택된 총 행 추가
SELECT your_columns, COUNT(*) OVER() as Ttl_Rows FROM your_data_set
| 신분증 | 이름 | Ttl_Rows | 
|---|---|---|
| 1 | 예 | 5 | 
| 2 | 푸 | 5 | 
| 삼 | 바 | 5 | 
| 4 | 바스 | 5 | 
| 5 | quux | 5 | 
 두 개의 쿼리를 사용하여 줄 수를 계산하는 대신 집계를 창 함수로 사용하고 전체 결과 집합을 창으로 사용할 수 있습니다. 
 이것은 추가 자기 조인의 복잡성없이 추가 계산을위한 기본으로 사용할 수 있습니다. 
다른 행에 공통 속성이있는 경우 플래그 설정
이 데이터가 있다고 가정 해 보겠습니다.
표 항목
| 신분증 | 이름 | 꼬리표 | 
|---|---|---|
| 1 | 예 | unique_tag | 
| 2 | 푸 | 단순한 | 
| 42 | 바 | 단순한 | 
| 삼 | 바스 | 여보세요 | 
| 51 | quux | 세계 | 
모든 라인을 얻고 다른 라인에서 태그를 사용하는지 알고 싶습니다.
SELECT id, name, tag, COUNT(*) OVER (PARTITION BY tag) > 1 AS flag FROM items
결과는 다음과 같습니다.
| 신분증 | 이름 | 꼬리표 | 깃발 | 
|---|---|---|---|
| 1 | 예 | unique_tag | 그릇된 | 
| 2 | 푸 | 단순한 | 참된 | 
| 42 | 바 | 단순한 | 참된 | 
| 삼 | 바스 | 여보세요 | 그릇된 | 
| 51 | quux | 세계 | 그릇된 | 
데이터베이스에 OVER 및 PARTITION이 없으면이 옵션을 사용하여 동일한 결과를 얻을 수 있습니다.
SELECT id, name, tag, (SELECT COUNT(tag) FROM items B WHERE tag = A.tag) > 1 AS flag FROM items A
누적 합계 얻기
이 데이터를 감안할 때 :
| 날짜 | 양 | 
|---|---|
| 2016-03-12 | 200 | 
| 2016-03-11 | -50 | 
| 2016-03-14 | 100 | 
| 2016-03-15 | 100 | 
| 2016-03-10 | -250 | 
SELECT date, amount, SUM(amount) OVER (ORDER BY date ASC) AS running
FROM operations
ORDER BY date ASC
너를 줄거야.
| 날짜 | 양 | 달리는 | 
|---|---|---|
| 2016-03-10 | -250 | -250 | 
| 2016-03-11 | -50 | -300 | 
| 2016-03-12 | 200 | -100 | 
| 2016-03-14 | 100 | 0 | 
| 2016-03-15 | 100 | -100 | 
여러 그룹화를 통해 N 개의 가장 최근 행 가져 오기
이 데이터가 주어지면
| User_ID | 완료 날짜 | 
|---|---|
| 1 | 2016-07-20 | 
| 1 | 2016-07-21 | 
| 2 | 2016-07-20 | 
| 2 | 2016-07-21 | 
| 2 | 2016-07-22 | 
;with CTE as
(SELECT *, 
        ROW_NUMBER() OVER (PARTITION BY User_ID 
                           ORDER BY Completion_Date DESC) Row_Num
FROM    Data)
SELECT * FORM CTE WHERE Row_Num <= n
 n = 1을 사용하면 user_id 당 하나의 가장 최근 행이 표시됩니다. 
| User_ID | 완료 날짜 | Row_Num | 
|---|---|---|
| 1 | 2016-07-21 | 1 | 
| 2 | 2016-07-22 | 1 | 
LAG () 함수를 사용하여 "out-of-sequence"레코드 찾기
다음 샘플 데이터를 제공합니다.
| 신분증 | 지위 | STATUS_TIME | STATUS_BY | 
|---|---|---|---|
| 1 | 하나 | 2016-09-28-19.47.52.501398 | USER_1 | 
| 삼 | 하나 | 2016-09-28-19.47.52.501511 | USER_2 | 
| 1 | 세 | 2016-09-28-19.47.52.501517 | USER_3 | 
| 삼 | 두 | 2016-09-28-19.47.52.501521 | USER_2 | 
| 삼 | 세 | 2016-09-28-19.47.52.501524 | USER_4 | 
 ID 값으로 식별되는 항목은 STATUS 를 건너 뛰지 않고 STATUS 'ONE'에서 'TWO'로 'THREE'로 순서대로 이동해야합니다. 문제는 규칙을 위반하는 사용자 ( STATUS_BY ) 값을 찾고 'ONE'에서 'THREE'로 즉시 이동하는 것입니다. 
 LAG() 분석 함수는 각 행에 대해 이전 행의 값을 반환하여 문제를 해결하는 데 도움이됩니다. 
SELECT * FROM (
 SELECT 
  t.*, 
  LAG(status) OVER (PARTITION BY id ORDER BY status_time) AS prev_status 
  FROM test t
) t1 WHERE status = 'THREE' AND prev_status != 'TWO'
데이터베이스에 LAG ()가없는 경우이 옵션을 사용하여 동일한 결과를 얻을 수 있습니다.
SELECT A.id, A.status, B.status as prev_status, A.status_time, B.status_time as prev_status_time
FROM Data A, Data B
WHERE A.id = B.id
AND   B.status_time = (SELECT MAX(status_time) FROM Data where status_time < A.status_time and id = A.id)
AND   A.status = 'THREE' AND NOT B.status = 'TWO'
Modified text is an extract of the original Stack Overflow Documentation
        아래 라이선스 CC BY-SA 3.0
        와 제휴하지 않음 Stack Overflow