Разбиение запроса и передача результатов одного запроса другому - PullRequest
0 голосов
/ 13 сентября 2011

У меня есть запрос, который, кажется, работает, но это занимает вечность.Я думаю, что если я разобью запрос на две части и передам результат первого запроса во второй, это может быть более эффективным.

Идея состоит в том, что таблица содержит данные для многих символов.Есть ли способ запросить в таблице только эти символы, например, 'AAPL', а затем передать этот результирующий набор в следующий запрос?

Это на SQL Server 2008 R2.

SELECT 
    T1.CompSymbol, 
    T1.TradeDate, 
    T1.Expiry, 
    MIN(T2.Expiry) AS 'FrontMonthContract' ,   
    MIN(T1.CompATMSynthStrike) AS 'CompATMSynthStrike',
    MIN(T1.CompATMSynthIV) AS 'CompATMSynthIV'   
FROM 
    BandHistory1M T1, BandHistory1M T2 
WHERE T1.TradeDate <= T2.Expiry AND T1.CompSymbol = 'AAPL'
GROUP BY T1.CompSymbol , T1.TradeDate, T1.Expiry
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq;
using System.Data.Linq.Mapping;

namespace ConsoleGetFrontMonth
{
    class Program
    {
        static void Main(string[] args)
        {
            Dictionary<int, int> frontMonthContract = new Dictionary<int, int>();
            frontMonthContract.Add(4, 17);
            frontMonthContract.Add(5, 16);
            frontMonthContract.Add(6, 20);
            frontMonthContract.Add(7, 18);
            frontMonthContract.Add(8, 22);
            frontMonthContract.Add(9, 19);
            frontMonthContract.Add(10, 17);
            frontMonthContract.Add(11, 21);
            //frontMonthContract.Add(5, 16);
            //frontMonthContract.Add(5, 16);

            BandsEntities bandsContext = new BandsEntities();

            IQueryable<BandHistory1M> symbolQuery =
                from source in bandsContext.BandHistory1M
                where source.CompSymbol == "AAPL"
                select source;


            foreach (var Symbol in symbolQuery)
            {
                int dayExpires;
                if(false == frontMonthContract.TryGetValue(Symbol.TradeDate.Month, out dayExpires))
                    continue;

                if (Symbol.TradeDate.Month == Symbol.Expiry.Month)
                {
                    if (Symbol.TradeDate.Day < dayExpires)
                    {
                        Console.WriteLine("{0} {1} {2}", Symbol.CompSymbol, Symbol.TradeDate, Symbol.Expiry);
                    }
                }
                else if(1 == (Symbol.Expiry.Month - Symbol.TradeDate.Month))
                {
                    if(Symbol.TradeDate.Day > dayExpires)
                        Console.WriteLine("{0} {1} {2}", Symbol.CompSymbol, Symbol.TradeDate, Symbol.Expiry);
                }
            }

            Console.ReadLine();
        }
    }
}

1 Ответ

0 голосов
/ 14 сентября 2011

Без определения таблицы, я просто догадываюсь, но попробуйте так:

(упс, первый был плохой ...)

или, может быть, даже это:

SELECT 
    T1.CompSymbol, 
    T1.TradeDate, 
    T1.Expiry, 
    MIN(T2.Expiry) AS 'FrontMonthContract' ,   
    MIN(T1.CompATMSynthStrike) AS 'CompATMSynthStrike',
    MIN(T1.CompATMSynthIV) AS 'CompATMSynthIV'   
FROM BandHistory1M T1
JOIN BandHistory1M T2  ON T1.TradeDate <= T2.Expiry
GROUP BY T1.CompSymbol , T1.TradeDate, T1.Expiry
HAVING T1.CompSymbol = 'AAPL'

Э-э ... Нет, я правильно понял в своем комментарии выше. Это пресловутая проблема «промежуточного итога» или « треугольного соединения ». Это легко сделать в клиентском коде, но эффективно сделать это можно только в TSQL с чрезвычайно хитрым (и неподдерживаемым) устройством, которое называется псевдокур или «странное обновление».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...