SELECT b.name, MAX (b.value) как MaxValue, MAX (b.nothercolumn) как AnotherColumn FROM out_pumptabl INNER JOIN (имя SELECT, MAX (значение) как MaxValue FROM out_pumptabl GROUP BY Name) a ON a.name = b.name AND a.maxValue = b.value GROUP BY b.Name
Обратите внимание, что это было бы намного проще, если бы у вас был первичный ключ. Вот пример
SELECT * FROM out_pumptabl c WHERE PK in (SELECT MAX (PK) как MaxPK FROM out_pumptabl b INNER JOIN (имя SELECT, MAX (значение) как MaxValue FROM out_pumptabl GROUP BY Name ) a ON a.name = b.name AND a.maxValue = b.value)
Я думаю, вы можете использовать webjob или роль рабочего для этого. Когда вы получите запрос пользователя, нажмите этот запрос в очередь, а затем верните идентификатор задания пользователю. Webjob или рабочая роль извлекают запрос из очереди и загружают эти файлы и зашифровывают их, а затем загружают zip-файл обратно в Storage blob. Код передней стороны может использовать опрос ajax roll с идентификатором задания, чтобы получить реальный URL-адрес загрузки, когда это будет сделано.
Я был бы на 99% уверен, что для любой zip-библиотеки, которую вы используете, потребуются локальные ресурсы / локальные файлы для создания zip-файла.
Посмотрите на Azure Local Storage для рабочих ролей .
http://vkreynin.wordpress.com/2010/01/10/learning-azure-local-storage-with-me/
Вы можете указать количество локального хранилища в своей рабочей роли, чтобы сохранить доступный контент в процессе.
, например
// Создать раздел локального хранилища в вашей конфигурации .
<WebRole name="...">
<LocalResources>
<LocalStorage name="myLocalStorage" sizeInMB="50"/>
</LocalResources>
</WebRole>
// Затем сохраните ваши файлы в локальном хранилище
CloudBlobContainer container = blobClient.GetContainerReference("myfiles");
CloudBlob blob = container.GetBlobReference("2b5f8ea6-3dc2-4b77-abfe-4da832e02556/AppList/isjirleq/mydocs1.doc");
LocalResource myStorage = RoleEnvironment.GetLocalResource("myLocalStorage");
string filePath = Path.Combine(myStorage.RootPath, "mydocs1.doc");
blob.DownloadToFile(filePath);
. Когда у вас есть все ваши файлы, сохраненные в LocalStorage, используйте ZipLibrary, чтобы собрать все ваши файловые пути вместе
Azure Drive
вместо локального хранилища. Во-первых, Azure Drive
может быть до 1 ТБ (что намного больше, чем локальное хранилище), а во-вторых, данные, однажды записанные на диск, сохраняются.
– Gaurav Mantri
17 September 2013 в 16:48
Поскольку хранилище blob является «просто» хранилищем объектов, вам нужно будет загружать их где-нибудь (это может быть роль веб-/ работника или ваш локальный компьютер), zip их и затем повторно загружать zip-файл. Это единственный способ сделать это, насколько мне известно.
Я не думаю, что вы можете избежать их загрузки, локально их скопировать и загрузить.
Утилиты сжатия работают только с локальными ресурсами. Сама Azure Storage не имеет понятия / способности иметь возможность сжимать некоторые файлы сама по себе
Не думайте, что azure предоставляет какие-либо функции из окна для zipping. Если вам нужно избегать поворота времени, возможно, использование роли рабочего фона - хорошая идея, которая выберет ваши файлы из определенной очереди. Запишите их, загрузите их и сохраните url для вы где-то вроде sql db.Я делал схожие вещи, общаюсь с db, поэтому вы можете быть уверены, что он будет работать очень быстро, если пользователь не поймет, что его на самом деле не происходит на лицевой стороне.
Мы решили эту проблему (частично), запустив файлы непосредственно в выходной поток, используя потоки blob. Это позволяет избежать проблемы с загрузкой zipping, а затем отправлять и избегать задержки, когда это происходит (мы использовали ICSharpZipLib, reference ). Но это все равно означает маршрутизацию потока через веб-сервер:
public void ZipFilesToResponse(HttpResponseBase response, IEnumerable<Asset> files, string zipFileName)
{
using (var zipOutputStream = new ZipOutputStream(response.OutputStream))
{
zipOutputStream.SetLevel(0); // 0 - store only to 9 - means best compression
response.BufferOutput = false;
response.AddHeader("Content-Disposition", "attachment; filename=" + zipFileName);
response.ContentType = "application/octet-stream";
foreach (var file in files)
{
var entry = new ZipEntry(file.FilenameSlug())
{
DateTime = DateTime.Now,
Size = file.Filesize
};
zipOutputStream.PutNextEntry(entry);
storageService.ReadToStream(file, zipOutputStream);
response.Flush();
if (!response.IsClientConnected)
{
break;
}
}
zipOutputStream.Finish();
zipOutputStream.Close();
}
response.End();
}
Служба хранения просто делает это:
public void ReadToStream(IFileIdentifier file, Stream stream, StorageType storageType = StorageType.Stored, ITenant overrideTenant = null)
{
var reference = GetBlobReference(file, storageType, overrideTenant);
reference.DownloadToStream(stream);
}
private CloudBlockBlob GetBlobReference(IFileIdentifier file, StorageType storageType = StorageType.Stored, ITenant overrideTenant = null)
{
var filepath = GetFilePath(file, storageType);
var container = GetTenantContainer(overrideTenant);
return container.GetBlockBlobReference(filepath);
}
response.Body
, убедитесь, что вы установили сборку предварительного просмотра SharpZipLib (совместимую с netstadnard) и удалите код, который дает синтаксические ошибки (например, BufferOutput
),
– CularBytes
24 June 2018 в 11:36