행 번호를 실제로 사용할 필요가없는 경우 TOP 1 행을 가져옵니다. 쿼리가 많이 단순화 될 수 있습니다. 나는 먼저 당신의 술어에 의해 가장 많이 걸러 질 테이블을 선택하는 것으로 시작하고 싶다. frs.fundraiserid와 조인에 참여하는 모든 열에 대한 좋은 인덱스가 있기를 바랍니다.
SELECT
TOP 2 customercampaignname + ' $' + CONVERT(VARCHAR(255), CAST(SUM(d.mastercurrencyamount) AS NUMERIC(36,2))) AS 'Check_Stub_Comment2',
ROW_NUMBER() OVER(ORDER BY SUM(d.mastercurrencyamount) DESC) as rownumber
FROM bb02_fundraiserrevenuestream frs
JOIN bb02_donationline dl ON
dl.fundraiserrevenuestreamid = frs.fundraiserrevenuestreamid
JOIN bb02_donation d ON
d.donationid = dl.donationid
WHERE frs.fundraiserid = 1869
AND d.customercampaignname IS NOT NULL
AND d.customercampaignname != ''
GROUP BY d.CustomerCampaignName
ORDER BY SUM(d.mastercurrencyamount) DESC
첫 번째 행 또는 두 번째 행을 선택할 수 있어야하므로 CTE 또는 하위 쿼리로 줄 바꿈해야합니다.
WITH topcampaign AS (
SELECT
TOP 2 customercampaignname + ' $' + CONVERT(varchar(255), CAST(SUM(d.mastercurrencyamount) AS NUMERIC(36,2))) AS 'Check_Stub_Comment2',
ROW_NUMBER() OVER(ORDER BY SUM(d.mastercurrencyamount) DESC) as rownumber
FROM bb02_fundraiserrevenuestream frs
JOIN bb02_donationline dl ON
dl.fundraiserrevenuestreamid = frs.fundraiserrevenuestreamid
JOIN bb02_donation d ON
d.donationid = dl.donationid
WHERE frs.fundraiserid = 1869
AND d.customercampaignname IS NOT NULL
AND d.customercampaignname != ''
GROUP BY d.CustomerCampaignName
ORDER BY SUM(d.mastercurrencyamount) DESC
)
SELECT * from topcampaign WHERE rownumber = 1
또 다른 가능한 최적화로서, 나는 CTE에서 CONVERT를 가져 와서 최종 선택에 넣었습니다. 그것이 많은 도움이되는지 확실하지 않습니다.
WITH topcampaign AS (
SELECT
TOP 2
customercampaignname,
SUM(d.mastercurrencyamount) AS amount,
ROW_NUMBER() OVER(ORDER BY SUM(d.mastercurrencyamount) DESC) as rownumber
FROM bb02_fundraiserrevenuestream frs
JOIN bb02_donationline dl ON
dl.fundraiserrevenuestreamid = frs.fundraiserrevenuestreamid
JOIN bb02_donation d ON
d.donationid = dl.donationid
WHERE frs.fundraiserid = 1869
AND d.customercampaignname IS NOT NULL
AND d.customercampaignname != ''
GROUP BY
d.CustomerCampaignName
ORDER BY
SUM(d.mastercurrencyamount) DESC
)
SELECT
rownumber,
customercampaignname + ' $' + CONVERT(varchar(255), CAST(amount AS NUMERIC(36,2))) AS 'Check_Stub_Comment2'
FROM topcampaign
WHERE rownumber = 1
- "rownumber ="가 중요합니다. 나는 오직 1 행만을 선택하거나 2 행만을 배정 할 수 있어야한다. – Induster
아래에 표시된 대답은이 쿼리를 더 빠르게 만들지 만 여전히 데이터베이스에 대한 n + 호출입니다. 필자의 경우에는 2 개의 결과에만 관심이 있으므로 데이터베이스에 한 번만 호출하면 임시 테이블에 저장됩니다. 그런 다음 상위 1 개 결과를 가져 와서 정렬하고 임시 테이블에서 상위 1 개 결과를 다시 가져올 수있었습니다. 이로 인해 총 쿼리 시간이 절반으로 줄었습니다. 답변 해 주셔서 감사합니다. – Induster