>  Q&A  >  본문

날짜별로 정렬하고 IN을 사용하여 여러 항목에 대한 최신 및 이전 항목을 가져옵니다.

<p>내 목표: <code>stock_id</code> 목록이 있고 각 <code>stock_id< ;/코드> </p> <p>이미지의 경우 이는 내가 원하는 것을 의미합니다.</p> <테이블 클래스="s-테이블"> <머리> <tr> <번째>stock_id <번째> 입찰 </tr> </머리> <본문> <tr> <td>3</td> <td>663.91953</td> </tr> <tr> <td>1</td> <td>46.44281</td> </tr> <tr> <td>2</td> <td>9.02798</td> </tr> </tbody> </테이블> <p>한 가지 문제는 Gazprom과 같은 주식이 정지되어 있어 마지막 시세 중 하나가 예를 들어 2021-06-06일 수 있다는 것입니다. </p> <p>이 경우 <code에서 where >quote_day = DATE(NOW())</code>를 사용하는 것은 작동하지 않습니다. </p> <p>또한 첫 번째 쿼리에 없는 첫 번째 하위 날짜와 동일한 날짜가 필요합니다. 이는 두 번째 쿼리로 수행할 수 있습니다. </p> <p>현재 솔루션은 PHP를 사용하고 있습니다. 이것은 효과가 있지만 성능은 완벽하지 않습니다. 예를 들어 100개의 주식을 5초 정도 소요됩니다. </p> <p>입찰을 어딘가에 저장할 수 있는 옵션이 있는 Redis를 사용할 수도 있습니다. </p> <p>현재:</p> <pre class="lang-sql Prettyprint-override"><code>`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 <p>전날: </p> <pre class="lang-sql Prettyprint-override"><code>`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는 고유합니다.</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粉653045807P粉653045807434일 전626

모든 응답(2)나는 대답할 것이다

  • P粉340980243

    P粉3409802432023-09-04 18:30:57

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

    으아악

    회신하다
    0
  • P粉899950720

    P粉8999507202023-09-04 12:31:54

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

    으아악

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

    바이올린

    회신하다
    0
  • 취소회신하다