제한에 가입하는 하나의 행
-
11-12-2019 - |
문제
나는 다음과 같은 쿼리:
SELECT sum((select count(*) as itemCount) * "SalesOrderItems"."price") as amount, 'rma' as
"creditType", "Clients"."company" as "client", "Clients".id as "ClientId", "Rmas".*
FROM "Rmas" JOIN "EsnsRmas" on("EsnsRmas"."RmaId" = "Rmas"."id")
JOIN "Esns" on ("Esns".id = "EsnsRmas"."EsnId")
JOIN "EsnsSalesOrderItems" on("EsnsSalesOrderItems"."EsnId" = "Esns"."id" )
JOIN "SalesOrderItems" on("SalesOrderItems"."id" = "EsnsSalesOrderItems"."SalesOrderItemId")
JOIN "Clients" on("Clients"."id" = "Rmas"."ClientId" )
WHERE "Rmas"."credited"=false AND "Rmas"."verifyStatus" IS NOT null
GROUP BY "Clients".id, "Rmas".id;
문제는 테이블 "EsnsSalesOrderItems"
할 수 있는 동 EsnId
에 다른 항목이 있습니다.내가 원하는 쿼리를 제한하만 풀에서 마지막 항목 "EsnsSalesOrderItems"
는 동 "EsnId"
.
의"마지막"항목입니다 내 말은 다음과 같다:
하나 마지막에 나와 테이블 "EsnsSalesOrderItems"
.그래서 예를 들면 "EsnsSalesOrderItems"
은 두 개의 항목 "EsnId" = 6
고 "createdAt" = '2012-06-19'
고 '2012-07-19'
각각해야만 나에게는 항목에서 '2012-07-19'
.
해결책
SELECT (count(*) * sum(s."price")) AS amount
, 'rma' AS "creditType"
, c."company" AS "client"
, c.id AS "ClientId"
, r.*
FROM "Rmas" r
JOIN "EsnsRmas" er ON er."RmaId" = r."id"
JOIN "Esns" e ON e.id = er."EsnId"
JOIN (
SELECT DISTINCT ON ("EsnId") *
FROM "EsnsSalesOrderItems"
ORDER BY "EsnId", "createdAt" DESC
) es ON es."EsnId" = e."id"
JOIN "SalesOrderItems" s ON s."id" = es."SalesOrderItemId"
JOIN "Clients" c ON c."id" = r."ClientId"
WHERE r."credited" = FALSE
AND r."verifyStatus" IS NOT NULL
GROUP BY c.id, r.id;
에서 쿼리를 질문가는 불법 집계를 통해 다른 집계:
sum((select count(*) as itemCount) * "SalesOrderItems"."price") as amount
Simplified 로 변환하여 법적인 문법:
(count(*) * sum(s."price")) AS amount
하지만 당신은 정말로 번식하는 횟수당 그룹?
검색 단 하나 줄 그룹당 "EsnsSalesOrderItems"
가 DISTINCT ON
.에 대한 자세한 설명:
또한 추가되는 테이블 별칭과 형식을 만드는 쿼리를 쉽게 구문 분석에 대한 인간의 눈입니다.할 수 있는 경우 피 낙타는 경우를 제거할 수 있는 모든 쌍따옴표 흐려합니다.
다른 팁
다음과 같습니다.
join (
select "EsnId",
row_number() over (partition by "EsnId" order by "createdAt" desc) as rn
from "EsnsSalesOrderItems"
) t ON t."EsnId" = "Esns"."id" and rn = 1
이것은 선택의 최신"EsnId"
서 "EsnsSalesOrderItems"
에 따라 열 creation_date
.당신이 게시하지 않는 구조의 테이블,나는"발명"란 이름입니다.당신이 사용할 수 있습의 열을 정의할 수 있는 주문에 행할 수 있습니다.
하지만 기억하의 개념을"마지막"행하는 경우에만 유효 당신이 지정하는 순서나 행이 있습니다.테이블 등과 같은 정렬하지 않은 아니며,쿼리 결과 지 당신은 지정 order by
Necromancing 기 때문에 답변할 수 있습니다.
의 활용 LATERAL
키워드에서 소개 PG9.3
왼쪽|오른쪽|내부 조 측면
설명 하겠습니다 예를 들어:
가정하면 테이블이 있"연락처"입니다.
지금 연락처가 조직 단위입니다.
그들은 하나 있을 수 있습 OU 시점에서 하지만,N Ou N 점에서 시간입니다.
지금,당신은에있는 경우 쿼리를 연락처 OU 기간 (지 않을 보고 날짜지만,그 날짜의 범위),할 수 있습 N-배 증가 레코드 개수는 경우에 당신은 단지 왼쪽입니다.
그래서,디스플레 OU,당신은 단지 참가 첫 번째 OU 에 대한 각각의 문의(여기서 무엇을 먼저 될 자도 임의의 기준-를 복용하는 경우 마지막 값을,예를 들어,그것은 단지 다른 방법을 말하는 첫 번째 값은 때를 기준으로 날짜기 위해).
에서 SQL-server,당신이 사용하는 것이 십자가 적용한(또는 오히려 외부 적용해야 하므로 왼쪽 가입하세)을 호출합니다 테이블을 반환 함수에서 각각의 행은 그것이있다.
SELECT * FROM T_Contacts
--LEFT JOIN T_MAP_Contacts_Ref_OrganisationalUnit ON MAP_CTCOU_CT_UID = T_Contacts.CT_UID AND MAP_CTCOU_SoftDeleteStatus = 1
--WHERE T_MAP_Contacts_Ref_OrganisationalUnit.MAP_CTCOU_UID IS NULL -- 989
-- CROSS APPLY -- = INNER JOIN
OUTER APPLY -- = LEFT JOIN
(
SELECT TOP 1
--MAP_CTCOU_UID
MAP_CTCOU_CT_UID
,MAP_CTCOU_COU_UID
,MAP_CTCOU_DateFrom
,MAP_CTCOU_DateTo
FROM T_MAP_Contacts_Ref_OrganisationalUnit
WHERE MAP_CTCOU_SoftDeleteStatus = 1
AND MAP_CTCOU_CT_UID = T_Contacts.CT_UID
/*
AND
(
(@in_DateFrom <= T_MAP_Contacts_Ref_OrganisationalUnit.MAP_KTKOE_DateTo)
AND
(@in_DateTo >= T_MAP_Contacts_Ref_OrganisationalUnit.MAP_KTKOE_DateFrom)
)
*/
ORDER BY MAP_CTCOU_DateFrom
) AS FirstOE
에 PostgreSQL 버전부터 9.3, 당신이 할 수 있는,도-사용 LATERAL
키워드하는 결과를 얻을:
SELECT * FROM T_Contacts
--LEFT JOIN T_MAP_Contacts_Ref_OrganisationalUnit ON MAP_CTCOU_CT_UID = T_Contacts.CT_UID AND MAP_CTCOU_SoftDeleteStatus = 1
--WHERE T_MAP_Contacts_Ref_OrganisationalUnit.MAP_CTCOU_UID IS NULL -- 989
LEFT JOIN LATERAL
(
SELECT
--MAP_CTCOU_UID
MAP_CTCOU_CT_UID
,MAP_CTCOU_COU_UID
,MAP_CTCOU_DateFrom
,MAP_CTCOU_DateTo
FROM T_MAP_Contacts_Ref_OrganisationalUnit
WHERE MAP_CTCOU_SoftDeleteStatus = 1
AND MAP_CTCOU_CT_UID = T_Contacts.CT_UID
/*
AND
(
(__in_DateFrom <= T_MAP_Contacts_Ref_OrganisationalUnit.MAP_KTKOE_DateTo)
AND
(__in_DateTo >= T_MAP_Contacts_Ref_OrganisationalUnit.MAP_KTKOE_DateFrom)
)
*/
ORDER BY MAP_CTCOU_DateFrom
LIMIT 1
) AS FirstOE
도를 사용하여 하위에서 귀하에 절이 있습니다.추상적인 예이다:
SELECT
*
FROM table1
JOIN table2 ON table2.id = (
SELECT id FROM table2 WHERE table2.table1_id = table1.id LIMIT 1
)
WHERE
...