Stock_id
, quote_date
및 currency_id
는 고유합니다.</p>
<p>내가 사용하는 앱은 10.9.4-MariaDB-1:10.9.4</p>
<p>编辑:</p>
<p>解释的查询:</p>
<pre class="brush:php;toolbar:false;">id select_type 테이블 유형 available_keys 키 key_len ref 행 추가
1 PRIMARY <파생2> ALL NULL NULL NULL NULL 220896 where 사용
2 DERIVED t ALL stock_id,quote_date NULL NULL NULL 2173105 where; 사용 임시</pre>
<p>创建表:</p>
<pre class="brush:php;toolbar:false;">CREATE TABLE `end_day_quotes_AVG` (
`id` int(11) NULL이 아님,
`quote_date` 날짜는 NULL이 아닙니다.
`입찰` 십진수(15,5) NOT NULL,
`stock_id` int(11) 기본 NULL,
`etf_id` int(11) 기본 NULL,
`crypto_id` int(11) 기본 NULL,
`certificate_id` int(11) 기본 NULL,
`currency_id` int(11) NOT NULL
) 엔진=InnoDB 기본 CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
`end_day_quotes_AVG`에 삽입(`id`, `quote_date`, `bid`, `stock_id`, `etf_id`, `crypto_id`, `certificate_id`, `currency_id`) VALUES
(10537515, '2023-01-02', '16.48286', 40581, NULL, NULL, NULL, 2),
(10537514, '2023-01-02', '3.66786', 40569, NULL, NULL, NULL, 2),
(10537513, '2023-01-02', '9.38013', 40400, NULL, NULL, NULL, 2),
(10537512, '2023-01-02', '8.54444', 40396, NULL, NULL, NULL, 2),
ALTER TABLE `end_day_quotes_AVG`
기본 키 추가(`id`),
키 `stock_id`(`stock_id`,`currency_id`)를 추가하세요.
키 `etf_id`(`etf_id`,`currency_id`)를 추가하세요.
키 `crypto_id`(`crypto_id`,`currency_id`)를 추가하세요.
ADD KEY `certificate_id`(`certificate_id`,`currency_id`),
ADD KEY `인용_날짜`(`인용_날짜`);
ALTER TABLE `end_day_quotes_AVG`
수정 `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=10570526;</pre>
<p>生成填充查询:</p>
<pre class="brush:php;toolbar:false;">`quote_date`, 'stocks'를 `type`으로, `bid`, `stock_id`를 ID로 선택
( t.*, row_number() 오버(stock_id로 파티션, `quote_date` desc로 파티션)를 rn으로 선택
end_day_quotes_AVG t에서 quote_date <= DATE('2023-01-02') AND stock_id in (2,23,19,41,40,26,9,43,22,
44,28,32,30,34,20,10,13,17,27,35,8,29,39,16,33,5,36589,25,18,6,38,37,3,45, 7,21,46,15,4,24,31,36,38423,40313,
22561,36787,35770,36600,35766,42,22567,40581,40569,29528,22896,24760,40369,40396,40400,40374,36799,1,27863,
29659,40367,27821,24912,36654,21125,22569,22201,
23133,40373,36697,36718,26340,36653,47,34019,36847,36694) 및 통화 ID = 2 ) x 여기서 rn = 1;</pre></p>
P粉3409802432023-09-04 18:30:57
특정 날짜를 기준으로 모든 입찰에 대한 두 최신 견적을 찾고 계십니까? 그렇다면 행 번호 1 및 2을 허용하도록 첫 번째 쿼리를 수정하면 됩니다.
으아악P粉8999507202023-09-04 12:31:54
단일 쿼리로 각 통화/주식에 대한 마지막 입찰(특정 날짜 이전)과 두 번째 입찰을 얻고 통화 ID, 주식 ID, 견적 날짜의 인덱스를 효율적으로 사용하려면 이 작업을 점진적으로 수행할 수 있습니다. 먼저 각 통화의 최대 날짜를 찾습니다. /stock(은 색인을 사용합니다), 이전 날짜를 찾은 다음(역시 색인을 사용하는 것과 같은 방식으로) 실제 입찰가를 찾습니다.
으아악각 주식에 대해 가장 최근 날짜 2개 이상을 원하는 경우 last_dates/next_to_last_dates를 일 수(수집하려는 일 수로 제한됨)가 포함된 재귀적 CTE로 바꿀 수 있습니다.