Diskuze: Porovnání dvou řádků
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Zobrazeno 5 zpráv z 5.
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
A co 2 selecty?
SELECT tab2.x, tab2.y, tab2.z FROM (SELECT ... FROM tab1 ... ORDER BY ... LIMIT)
tab2
Mozna by slo nacist 2x tutez tabulku, jenom do jednoho sloupce pridat COUNT() a ve druhe COUNT() + 1. Hodnoty zapsat jako +tab1.value, -tab2.value. A pak to zgrupovat podle sloupce s count pomoci SUM.
[id, order, value] tab
1, 'a', 3
2, 'x', 8
3, 'b', 4
tab1 = SELECT `id, `order`, `value` FROM `tab`... ORDER BY `order` ASC
1, 'a', 3
3, 'b', 4
2, 'x', 8
tab2 = SELECT `id`, `order`, `value`, COUNT() AS `group` FROM `tab1`
1, 'a', 3, 1
3, 'b', 4, 2
2, 'x', 8, 3
tab3 = SELECT `id`, `order`, -`value`, COUNT()+1 AS `group` FROM `tab1`
1, 'a', -3, 2
3, 'b', -4, 3
2, 'x', -8, 4
JOIN tab2 + tab3
1, 'a', 3, 1
3, 'b', 4, 2
2, 'x', 8, 3
1, 'a', -3, 2
3, 'b', -4, 3
2, 'x', -8, 4
GROUP BY `order` + SUM
1, 'a', 3, 1
3, 'b', 4, 2 | 1, 'a', -3, 2 = 3, 'b', 4-3, 2
2, 'x', 8, 3 | 3, 'b', -4, 3 = 2, 'x', 8-4, 3
2, 'x', -8, 4
google = How to calculate value of column row 1 + row 2
https://www.codeproject.com/…row-plus-row
WITH CTE AS(
SELECT rownum = ROW_NUMBER() OVER (ORDER BY a.clientID), a.JumlahClient
FROM GroupAttendance a
)
SELECT
CTE.JumlahClient JumlahHadir,
prev.JumlahClient + CTE.JumlahClient SumTotal
FROM CTE
LEFT JOIN CTE prev ON prev.rownum = CTE.rownum - 1
S tim googlem by to slo napsat takto, asi. kde prvni tab2 nahradis tim dvojitym selectem. Dvojitym, protoze prvnim si to vytahnes ve spravnem poradi a pak k tomu pridavas ten count. Mozna bude treba pro left join rozepsat tab2 tez na select+select.
SELECT
`tab2`.`id`,
`tab2`.`order`,
`tab2`.`value` - `tab3`.`value` `diff`
FROM `tab2`
LEFT JOIN `tab2` `tab3` ON `tab3`.`count` = `tab2`.`count` - 1
--
SELECT
`tab2`.`id`,
`tab2`.`order`,
`tab2`.`value` - `tab3`.`value` `diff`
FROM (SELECT...COUNT() AS `count` (SELECT)) `tab2`
LEFT JOIN `tab2` `tab3` ON `tab3`.`count` = `tab2`.`count` - 1
-- LEFT JOIN (SELECT...COUNT() AS `count` (SELECT...)) `tab3` ON `tab3`.`count` = `tab2`.`count` - 1
-- stejny, protoze to joinujes podle count a count-1, `tab3`.`count` = `tab2`.`count` - 1
Jsem těžký amatér, ale vůbec jsem to nepochopil. Možná jsem to napsal blbě. Zkusím to napsat jinak. Ve výpise z DB pomocí FOREACH budu mít následující tři sloupce (id akce, datum start, datum konec):
řádek1: id1 - start1 - konec1
řádek2: id2 - start2 - konec2
řádek3: id3 - start3 - konec3
řádek4: id4 - start4 - konec4
řádek5: id5 - start5 - konec5
... atd.
A já nyní potřebuji ke každému řádku zjistit, kolik uběhlo času mezi koncem jedné akce (konec1) a začátkem druhé akce (start2). A takhle vypsat všechny časy mezi jednotlivými řádky, tedy čas mezi konec2-start3, konec3-start4,...atd. Výpis by pak vypadal takto:
řádek1: id1 - start1 - konec1 - NULL
řádek2: id2 - start2 - konec2 - čas mezi akcemi
řádek3: id3 - start3 - konec3 - čas mezi akcemi
řádek4: id4 - start4 - konec4 - čas mezi akcemi
řádek5: id5 - start5 - konec5 - čas mezi akcemi
... atd.
Vždy se jedná o DATETIME na mezičas TIME.
Z výše uvedených příkladů jsem to vůbec nepochopil. Takže i když budu
vypadat jako blbec, prosím o nějaké "laické" vysvětlení.
Díky moc.
Tak jinak
SELECT `id`, `order`, SUM(`value`) AS
FROM (
SELECT `id`, `order`, `date1` AS `value`, COUNT() AS `x` FROM `tab1` ... ORDER BY ...
UNION ALL
SELECT `id`, `order`, -`date2` AS `value`, COUNT()+1 AS `x` FROM `tab1` ... ORDER BY ...
) `tab2` -- spojena tab musi mit jmeno/alias
GROUP BY `tab2`.`x`
Vyberes tabulku podle tvych pozadavku a pridas sloupec x=count(). (cislovani
radku 1, 2, 3, 4...)
Totez, jine datum, jiny x, x=count()+1 (2, 3, 4...)
A podle tohoto sloupce X to zgrupujes a provedes sumu.
Zobrazeno 5 zpráv z 5.