Програма по софтуерно инженерство
Loading...
+ Нов въпрос
simeon_petrov avatar simeon_petrov 45 Точки

[Exercise] 5 Data Aggregation * Smallest Deposit Group per Magic Wand Size

Select the deposit group with the lowest average wand size.

select [DepositGroup] FROM
  (SELECT w.DepositGroup AS [DepositGroup], AVG(w.MagicWandSize) AS
    [LongestMagicWand]
     FROM WizzardDeposits AS w
        GROUP BY [DepositGroup]   ) AS Result
        HAVING Result.[LongestMagicWand] = min(Result.LongestMagicWand)

Така не става, някой може ли да каже как трябва да се направи?

Тагове:
0
Databases Basics
wallbanger avatar wallbanger 54 Точки
SELECT avgTbl.DepositGroup
FROM
(
SELECT av.DepositGroup, AVG(av.MagicWandSize) AS AvgMGWS FROM [dbo].[WizzardDeposits] AS av
        GROUP BY av.DepositGroup) avgTbl
JOIN
(
   SELECT MIN(AvgSize.AvgMGWS) AS mmm
FROM 
        (
           SELECT av.DepositGroup, AVG(av.MagicWandSize) AS AvgMGWS
                     FROM [dbo].[WizzardDeposits] AS av
                         GROUP BY av.DepositGroup
        )
                 AS AvgSize
) AS minTbl
ON avgTbl.AvgMGWS=minTbl.mmm

 

2
09/10/2016 11:50:27
simeon_petrov avatar simeon_petrov 45 Точки

Благодаря, много полезно!

0
wallbanger avatar wallbanger 54 Точки

Сори за качеството, но бързах като го писах :(

0
simeon_petrov avatar simeon_petrov 45 Точки

Перфектно е! Качеството си е ОК.

0
BorisSimeonov avatar BorisSimeonov 26 Точки

Още едно бързо решение за тези, които ще решават задачката, но имат проблеми :)

SELECT
                    w.[DepositGroup]
FROM           WizzardDeposits w
GROUP BY   w.[DepositGroup]
HAVING AVG (w.MagicWandSize) = (
        SELECT
                     MIN (WandSizeTable.AverageSizes) AS MinimalSize
        FROM (
                    SELECT
                                AVG (w.MagicWandSize) AS AverageSizes
                    FROM WizzardDeposits w
                    GROUP BY w.DepositGroup

        ) AS WandSizeTable
)

0
18/01/2017 22:47:54
ZornitsaSerbezova avatar ZornitsaSerbezova 454 Точки

Може ли да ми обясните на български какво се иска в тази задача?

1
Maria_ls avatar Maria_ls 383 Точки

@Zornica, Иска се подобно на предната, но да вземем средните Wandsize за всяка група и да изкараме само тези с най-ниските ст-сти за въпросното. От пръв опит - на един път явно няма да стане...

1
27/01/2017 14:29:25
ZornitsaSerbezova avatar ZornitsaSerbezova 454 Точки

Ох, много ми е трудно да разбера. Как така само най-ниските стойности. Аз условието го превеждам така:

"Изберете групата с най-ниска средна стойност.", което за мен е един ред (една група). Защо в решението има два реда? Явно групите имат еднакви стойности. Много съм зле явно.. сега ще изкарам колоната да видя.

 

1
27/01/2017 15:45:59
baremka avatar baremka 0 Точки

ЕТО И МОЕТО РЕШЕНИЕ, ЗА КОЕТО В JUDGE МИ ДАДЕ 100/100:

SELECT DepositGroup
FROM WizzardDeposits
GROUP BY [DepositGroup]
HAVING AVG(MagicWandSize) <
(
    SELECT AVG(MagicWandSize) FROM WizzardDeposits
)

 

Поздрави на всички!

0
DDaskalov avatar DDaskalov 10 Точки

Това наистина е добро и кратко... поне за джъджа става :) Но все още се опитвам да разбера как да сработи в генералния случай и да минава в джъджа...

0
31/01/2017 22:14:51
Jessie avatar Jessie 3 Точки

Че е кратко .... кратко е. Но е абсолютна случайност че е сработило - това е така само защото средната дължина на всички пръчки е 21, а верните отговори са с 20. Сега си представете в някоя група да има много по-големи пръчки (можете да си добавите такива записи в базата), което ще качи общата средна дължина и вече пресяване с:

HAVING AVG(MagicWandSize) <
(
    SELECT AVG(MagicWandSize) FROM WizzardDeposits
)

ще даде всички под общата средна стойност, а не само най-малките!

Мале малко перверзно звучи с тия пръчки : )

0
31/01/2017 13:47:49
DDaskalov avatar DDaskalov 10 Точки

Напълно си прав. и аз обмислях такъв вариант...

0
DenitsaDremsizova avatar DenitsaDremsizova 3 Точки

Най-краткото, което успях да измисля:

SELECT DepositGroup
 FROM WizzardDeposits
 GROUP BY DepositGroup
 HAVING AVG(MagicWandSize) = (
    SELECT TOP (1) AVG(MagicWandSize)
    FROM WizzardDeposits
    GROUP BY DepositGroup
    ORDER BY AVG(MagicWandSize)
 );

@Зорница - според мен си съвсем права да разбираш условието като "изберете ГРУПАТА (в ед. число) с най-малък среден Magic Wand Size", защото точно това пише... Реално ако сметнем средният Magic Wand Size (каквото и да значи това) като float, както би трябвало, резултатът си е само един (Troll Chest групата е с 20,219512195122, а Venomous Tongue с 20,3). Тогава това щеше да е достатъчно:

SELECT TOP (1) DepositGroup
 FROM WizzardDeposits
 GROUP BY DepositGroup
 ORDER BY AVG(CAST((MagicWandSize) AS FLOAT));

Но явно който е писал задачата е имал предвид да се смятат средните стойности като цели числа и съответно на двете групи ще е все 20.

0
Sotirovgym avatar Sotirovgym 2 Точки

А защо моето решение не го приема judge?

SELECT TOP (2) DepositGroup, AVG(MagicWandSize) AS AverageSize
  FROM WizzardDeposits
GROUP BY DepositGroup
ORDER BY AVG(MagicWandSize)

0
butoff avatar butoff 33 Точки

Моят кандидат:

SELECT TOP(2)DepositGroup  FROM WizzardDeposits
GROUP BY DepositGroup
ORDER BY AVG(MagicWandSize)

 

Групирането на магьосниците става възможно с GROUP BY , а подреждането според данните от AVG(MagicWandSize).

Подреждаме ги ascending-по подразбиране и избираме ТОП 2

Keep It Simple Stupid

 

0
30/09/2017 12:23:27