Rekordy które jako pierwsze (created_at) mają najwyższą wartość w danej kolumnie

0

Tak jak w temacie. Próbuję, ale nie mam pomysłu, a jeśli się da to nie chciałbym tworzyć nowej kolumny, w której zaznaczałbym czy dany rekord jest "rekordowy" pod względem wartości w danej kolumnie.

Więc mam dużo rekordów i jest między innymi kolumna users_count. Chciałbym zrobić wykres, gdzie będą pokazane kiedy padł pierwszy rekord najwyższej ilości użytkowników.

W jaki sposób mogę wyciągnąć rekordy od najstarszych do najnowszych i bez duplikatów, które jako pierwsze osiągnęły rekord w kolumnie users_count?

1

Ale to nie jest kwestia laravela tylko samego sqla, jeśli dobrze rozumiem to wystarczy ci podwójny order by

Model::orderBy('users_count', 'DESC')
    ->orderBy('created_at', 'DESC')
    ->get();
0

Dzięki za odpowiedź, ale niestety to nie rozwiązuje mojego problemu. Próbowałem na różne takie proste sposoby, ale wyniki są zdublowane

{
"users_count": 139,
"created_at": "2023-04-08T16:34:09.000000Z"
},

{
"users_count": 139,
"created_at": "2023-04-08T16:28:11.000000Z"
},


{
"users_count": 138,
"created_at": "2023-04-08T17:16:09.000000Z"
},

{
"users_count": 138,
"created_at": "2023-04-08T17:10:12.000000Z"
},
...
0

Nie są zbublowane są dokładnie takie jakie chciałeś czyli posortowane po ilości i po dacie. Opisz dokładnie co potrzebujesz bo na razie to wynika z tego że jedno chcesz a o drugie prosisz.

0

Chcę uzyskać rekordy, które jako pierwsze mają najwyższą wartość users_count począwszy od najmniejszych do największych (users_count i created_at).

Więc chciałbym otrzymać takie wyniki:

{
"users_count": 139,
"created_at": "2023-04-08T16:34:09.000000Z"
},

{
"users_count": 138,
"created_at": "pierwsza data rekordów, które mają wartość users_count 138"
},


{
"users_count": 137,
"created_at": "pierwsza data rekordów, które mają wartość users_count 137"
},

{
"users_count": 136,
"created_at": "pierwsza data rekordów, które mają wartość users_count 136"
},
...

Chcę mieć listę jaki i kiedy padł rekord kolumny users_count

1
Model::select(DB::raw('MIN(created_at) as created_at'), 'users_count')
->groupBy('users_count')
->orderBy('users_count')
->get();
0

Dzięki za pomoc, już prawie.. ale daty się nie zgadzają.

Np. dla rekordu 134 users_count data jest pomiędzy nowszymi datami

{
"created_at": "2023-04-06T19:40:12.000000Z",
"users_count": 133
},

{
"created_at": "2023-04-04T19:58:10.000000Z",
"users_count": 134
},

{
"created_at": "2023-04-08T13:16:10.000000Z",
"users_count": 135
},

{
"created_at": "2023-04-08T14:40:10.000000Z",
"users_count": 136
},

{
"created_at": "2023-04-08T14:16:11.000000Z",
"users_count": 137
},

{
"created_at": "2023-04-08T15:10:10.000000Z",
"users_count": 138
},

{
"created_at": "2023-04-08T16:28:11.000000Z",
"users_count": 139
}
]
0

Czy jesteś pewny że chcesz coś takiego o czym teraz mówisz? Bo ja zrobiłem dokładnie to co chciałeś wcześniej czyli pokazuje najniższa datę dla rekordów z konkretnym user_count, nie da się napisać takiego zapytania żeby jeszcze patrzyło na sąsiednie wyniki.

0

Kurcze, sam już nie wiem, ale przecież nie może być pokazane, że większy rekord padł dzień/klika godzin wcześniej niż następny większy rekord

0

To jeśli masz taką sytuację tzn że ta wyższa liczba padła wcześniej niż ta niższa więc powinieneś obrobić te dane i usunąć wynik z 133 bo 134 padł wcześniej więc 133 nigdy nie było rekordem userów.

0

Wrzuć przykład danych wejściowych i wyjściowych i opisz jeszcze raz co dokładnie w nich trzymasz, dlaczego i co chcesz uzyskać. Bo jak czytam to mam wrażenie, że chcesz uzyskać zupełnie co innego niż opisujesz.

0

Taki oto kod mam. Jak na razie wygląda na to, że działa poprawnie. Jednak mam ograniczony zestaw danych, więc nie jestem w stanie w 100% stwierdzić. A waszym okiem wygląda to ok?

 return Model::select('created_at', 'users_count')
            ->where('users_count', '>', 0)
            ->orderBy('users_count', 'desc')
            ->groupBy('users_count')
            ->get()
            ->reduce(function (?Collection $collection, $item) {
                if (!$collection) $collection = collect();

                if ($collection->count() == 0 || $collection->last()?->created_at >= $item->created_at) {
                    $collection->push($item);
                }

                return $collection;
            })
            ->reverse()
            ->values();
0

->where('users_count', '>', 0)
To liczba użytkowników może być w ogóle mniejsza od zera?
W reduce sprawdzasz czy jest kolekcja. Nie wiem jakiej wersji używasz ale od 6 chyba już tylko kolekcja mogła być zwracana z tego co kojarzę. Sprawdź to.
No i ciągle nie wiem logicznie co chcesz uzyskać w wyniku. To ciężko ocenić ten kod w reduce. Ja bym pewnie tak nie napisał.

0

To liczba użytkowników może być w ogóle mniejsza od zera?

Mniejsza od zera być nie może, ale może być równa zeru.

W reduce sprawdzasz czy jest kolekcja. Nie wiem jakiej wersji używasz ale od 6 chyba już tylko kolekcja mogła być zwracana z tego co kojarzę

Laravel 10. Na początku kolekcji nie ma, więc trzeba ją utworzyć. No mniejsza, tak jak pisałem, zestaw danych mam ograniczony, ale na chwile obecną wygląda na to, że śmiga tak jak chciałem.

I żeby zaspokoić twoją ciekawość - no nie wiem jak to mam napisać. To jest wykres ukazujący nowe rekordy użytkowników online. 1 maja było padł rekord 20 użytkowników, więc go pokazuje, w następny dzień padł kolejny rekord 25 użytkowników itd. No a pomiędzy tymi rekordami są też oczywiście mniejsze liczby

0

Mniejsza od zera być nie może, ale może być równa zeru

Ale możesz wycinać zero jeśli to jest maksymalna ilość?
Jak masz wykres tygodniowy i przez tydzień nikt się nie zaloguje to co pokażesz na wykresie?
Dla mnie SQL z having max by wystarczył chyba ale najlepiej podaj wejście i wyjście.

0

To jest tylko wykres rekordowych wartości - jeśli nie ma czego pokazać to nie pokazuje. Na innym wykresie, gdzie pokazuje dane z danego okresu jest dokładnie tak jak piszesz - wtedy pokazują się rekordy również z zerową ilością użytkowników.

No i ten wykres rekordowych wartości jest od początku do bieżącego dnia

0

To inaczej. Jak ma wyglądać ten wykres?
Wrzuć narysowany ręcznie, określ osie dodaj jakieś wartości.

0

No takie coś. Cały czas idzie do góry. Jeśli po ostatnim rekordzie (7 maja) nie było żadnych nowych rekordów (czyli nowej wyższej liczby uzytkowników online) to wykres się zatrzymuje na 7 maja 11:00

screenshot-20230507114340.png

0

A co jeśli 6 maja maks to będzie 1 użytkownik?
Albo 6 maja będzie 100, siódmego 102, ale ósmego znów 99?

0

Nic, jest pomijane (wszystkie mniejsze są pomijane, bo to ma być wykres tylko rekordowych wartości). To tylko historia najwyższej liczby użytkowników. Kiedy padł nowy rekord i tyle

0

Twoja logika jest totalnie bez sensu

"Więc mam dużo rekordów i jest między innymi kolumna users_count. Chciałbym zrobić wykres, gdzie będą pokazane kiedy padł pierwszy rekord najwyższej ilości użytkowników."

Rekord padl wczoraj i tyle. wiec jaki chcesz wykres? to tak jakbys do rekordu Ginesa wpisywal rekord z danego dnia. Jesli cos padlo pierwszy raz to nie moze pasc drugi raz jako pierwszy raz tak? WIec mozesz zrobic tylko informacje ze tego dnia padl pierwszy raz rekord, jesli innego dnia bedzie wiecej uzytkownikow to jest to tylko pobicie pierwszego rekordu ale nie jest to pierwszy raz tylko drugi raz i kolejne.

Z twojego opisu wynika ze chcesz zrobic liste (wykres) kiedy danego dnia bylo ile uzytkownikow bo to nie ma nic wspolnego z zadnymi rekoradmi i albo posortujesz to od ilosci ludzi count_user albo datami

Ewentualnie masz pierwszego dnia 100 osob
drugi dzien 120 osob - zapisujesz te date
trzeci dzien 99 osob
czwraty dzien 180 osob - zapisujesz te date

czyli wyswiwtlasz tylko te daty w ktorych liczba uzytkownikow danego dnia byla wieksza niz najwieksza liczba uzykownikow z poprzedniech dni

SELECT *
FROM tabelka tb
WHERE tb.users_count > (
    SELECT MAX(users_count)
    FROM tabelka
    WHERE created_at < tb.created_at
)

i to ci wypisze wszystkie te daty, po co to komplikowac jakims zawilym kodem sql

1 użytkowników online, w tym zalogowanych: 0, gości: 1