To je samozřejmě správné řešení. Ale využívá vestavěné silné nástroje. Zajímavější je pokusit se to naprogramovat v detailu. S těmi čtyřmi prvky to působí tak nevinně, ale úplně jednoduché to není.
Příspěvky odeslané z IP adresy 89.177.134.–
Řekněme, že se jedná o zadání, kdy daný kód se spouští opakovaně cyklicky. Pak by mohl mít smysl požadavek, aby se po sobě generovaná čísla neopakovala. Pokud ovšem množina, ze které se generuje, má pouze dva prvky, pak výsledek bude vždy stejný. 1 2 1 2 1 2 ... eventuelně 2 1 2 1 2 1 2 ... :) Ovšem pokud by množina měla tři prvky, pak už by to dávalo smysl. Po prvním výběru z množiny 1, 2, 3 by se v následujím kroku muselo vybírat pouze z množiny o dvou prvcích (zbývajících). A po té opět, pouze množina zbývajících by byla jiná. A tak dále...
Zadání není úplné. V tom příkladu, který jsi napsal, se nemá co opakovat. Asi ho budeš muset doplnit :)
Řešení je logická úvaha o třech krocích:
1. Části zadání "Z Následující tabulky potřebuji applicantprofileid z grupovat aby co radek to jedno id a neopakovalose" odpovídá řešení
SELECT a.applicantprofileid
FROM NEZNAMATABULKA a
group by a.applicantprofileid;
2. část "k tomu nejvyssi responsedate" původní řešení rozšírí o druhé pole
SELECT a.applicantprofileid, max(a.responsedate)
FROM NEZNAMATABULKA a
group by a.applicantprofileid;
3. a poslední část zadání "a dle toho jaky responsedate to byl priradit ze stejneho radku jako responsdate announcementid" rozšíří řešení o třetí pole, jehož hodnotu je potřeba nějak získat. Bylo by krásné, kdyby SELECT uměl optimalizační zkratku "našel-li jsi max(a.responsedate), tak k němu přiřaď jeho announcementid". Ale bohužel neumí. Takže je potřeba tuto hodnotu znovu nalézt kompletním separátním selectem
(select max(a2.announcementid) from NEZNAMATABULKA a2 where a2.applicantprofileid = a.applicantprofileid and a2.responsedate = max(a.responsedate))
Syntaxe SQL má svou krásu a eleganci, ale bohužel také své limity.
Omlouvám se, byly tam nějaké zbytky z mého experimentu. Tak ještě jednou, teď i s tím max místo first (může tam být i třeba min, to záleží..):
SELECT a.applicantprofileid, max(a.responsedate),
(select max(a2.announcementid) from NEZNAMATABULKA a2 where a2.applicantprofileid = a.applicantprofileid and
a2.responsedate = max(a.responsedate))
FROM NEZNAMATABULKA a
group by a.applicantprofileid;
Může být nějak takto
SELECT a.applicantprofileid, max(a.responsedate),
(select first 1 a2.announcementid from PARAMVALUE a2 where a2.applicantprofileid = a.applicantprofileid and
a2.responsedate = max(a.responsedate))
FROM NEZNAMATABULKA a
where a.applicantprofileid in (1,2,3)
group by a.applicantprofileid;
To first 1 je tam proto, že ten záznam je nejednoznačný, pokud existuje více takových záznamů (pokud syntaxe vašeho SQL nepodporuje first, tak můžete dát třeba max())
private void přesuň(int v, int z, int d)
{
if (v > 1) přesuň(v - 1, z, 6 - z - d);
Console.WriteLine("{0} {1}", z, d);
if (v > 1) přesuň(v - 1, 6 - z - d, d);
}
private static void přesuň(int v, int z, int d)
{
if (v == 1)
{
Console.WriteLine("{0} {1}", z, d);
}
else if (v > 1)
{
přesuň(v - 1, z, 6 - z - d);
přesuň(1, z, d);
přesuň(v - 1, 6 - z - d, d);
}
}
Dobrý den, program simuluje všechny permutace s opakováním, tiskne po řádcích jednotlivé varianty. Každý řádek reprezentuje všechny prvky na jednotlivých pozicích, přičemž číslo na každé pozici značí, ze které skupiny prvků je prvek na daném místě. Tedy počet řádků je počet permutací. Proměnná 'i' je ve všech třech cyklech pouze lokální pomocný index. Proměnná k už je zajímavější. Reprezentuje pozici prvku, pro který se pro daný řádek generuje/zjišťuje ze které má být skupiny. Metoda print se volá pro všechny prvky pro všechny řádky. Jede se pěkně souvisle po řádcích a každý postupně pro k od 0 až po počet prvků-1. Rekurze pracuje tak, že v každý okamžik dělí prvky na dvě poloviny. Tu první považuje za danou, v té druhé hledá všechny kombinace, resp. kombinaci následující. Takže hemžení probíhá odprava, naopak nejpomalejší pohyb je vlevo.