내 목표: stock_id
목록이 있고 각 stock_id< ;/코드>
이미지의 경우 이는 내가 원하는 것을 의미합니다.
<테이블 클래스="s-테이블"> <머리>한 가지 문제는 Gazprom과 같은 주식이 정지되어 있어 마지막 시세 중 하나가 예를 들어 2021-06-06일 수 있다는 것입니다.
이 경우 quote_day = DATE(NOW())
를 사용하는 것은 작동하지 않습니다.
또한 첫 번째 쿼리에 없는 첫 번째 하위 날짜와 동일한 날짜가 필요합니다. 이는 두 번째 쿼리로 수행할 수 있습니다.
현재 솔루션은 PHP를 사용하고 있습니다. 이것은 효과가 있지만 성능은 완벽하지 않습니다. 예를 들어 100개의 주식을 5초 정도 소요됩니다.
입찰을 어딘가에 저장할 수 있는 옵션이 있는 Redis를 사용할 수도 있습니다.
현재:
`quote_date`, 'stocks'를 `type`으로, `bid`, `stock_id`를 id로 선택합니다. 에서 ( t.*, row_number()를 선택하세요. over('quote_date' desc에 의한 stock_id 순서로 파티션) as rn end_day_quotes_AVG부터 여기서 quote_date <= DATE({$date}) AND ({$val})의 stock_id 및 통화 ID = {$c_id} ) x 여기서 rn = 1전날:
`quote_date`, 'stocks'를 `type`으로, `bid`, `stock_id`를 id로 선택합니다. 에서 ( t.*, row_number()를 선택하세요. over('quote_date' desc에 의한 stock_id 순서로 파티션) as rn end_day_quotes_AVG부터 여기서 quote_date < DATE({$date}) AND ({$val})의 stock_id 및 통화 ID = {$c_id} ) x 여기서 rn = 1
Stock_id
,quote_date
및currency_id
는 고유합니다.
내가 사용하는 앱은 10.9.4-MariaDB-1:10.9.4
编辑:
解释的查询:
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; 사용 임시
创建表:
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;
生成填充查询:
`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;
번째>
번째>
특정 날짜를 기준으로 모든 입찰에 대한두최신 견적을 찾고 계십니까? 그렇다면 행 번호 1및 2을 허용하도록 첫 번째 쿼리를 수정하면 됩니다.
으아악단일 쿼리로 각 통화/주식에 대한 마지막 입찰(특정 날짜 이전)과 두 번째 입찰을 얻고 통화 ID, 주식 ID, 견적 날짜의 인덱스를 효율적으로 사용하려면 이 작업을 점진적으로 수행할 수 있습니다. 먼저 각 통화의 최대 날짜를 찾습니다. /stock(은색인을 사용합니다), 이전 날짜를 찾은 다음(역시 색인을 사용하는 것과 같은 방식으로) 실제 입찰가를 찾습니다.
으아악각 주식에 대해 가장 최근 날짜 2개 이상을 원하는 경우 last_dates/next_to_last_dates를 일 수(수집하려는 일 수로 제한됨)가 포함된 재귀적 CTE로 바꿀 수 있습니다.
바이올린