날짜별로 정렬하고 IN을 사용하여 여러 항목에 대한 최신 및 이전 항목을 가져옵니다.
P粉653045807
P粉653045807 2023-09-03 23:52:49
0
2
547

내 목표: stock_id 목록이 있고 각 stock_id< ;/코드>

이미지의 경우 이는 내가 원하는 것을 의미합니다.

<테이블 클래스="s-테이블"> <머리> <번째> stock_id <번째> 입찰 <본문> 3 663.91953 1 46.44281 2 9.02798

한 가지 문제는 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_datecurrency_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;

P粉653045807
P粉653045807

모든 응답 (2)
P粉340980243

특정 날짜를 기준으로 모든 입찰에 대한최신 견적을 찾고 계십니까? 그렇다면 행 번호 1및 2을 허용하도록 첫 번째 쿼리를 수정하면 됩니다.

으아악
    P粉899950720

    단일 쿼리로 각 통화/주식에 대한 마지막 입찰(특정 날짜 이전)과 두 번째 입찰을 얻고 통화 ID, 주식 ID, 견적 날짜의 인덱스를 효율적으로 사용하려면 이 작업을 점진적으로 수행할 수 있습니다. 먼저 각 통화의 최대 날짜를 찾습니다. /stock(색인을 사용합니다), 이전 날짜를 찾은 다음(역시 색인을 사용하는 것과 같은 방식으로) 실제 입찰가를 찾습니다.

    으아악

    각 주식에 대해 가장 최근 날짜 2개 이상을 원하는 경우 last_dates/next_to_last_dates를 일 수(수집하려는 일 수로 제한됨)가 포함된 재귀적 CTE로 바꿀 수 있습니다.

    바이올린

      최신 다운로드
      더>
      웹 효과
      웹사이트 소스 코드
      웹사이트 자료
      프론트엔드 템플릿
      회사 소개 부인 성명 Sitemap
      PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!