문제

나는 다음과 같은 쿼리:

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 
    ...
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top