Mysql
 sql >> Baza danych >  >> RDS >> Mysql

grupuj według wartości niezerowych

Myślę, że następujące rzeczy robią to, co chcesz:

SELECT *, (To_days(date_expires)-TO_DAYS(NOW())) as dayDiff, COUNT(id) AS change_count
FROM mytable
GROUP BY (case when source_id is null then id else source_id end)
HAVING dayDiff < 4 
ORDER BY (case when source_id is null then 1 else 0 end), date_created DESC

Wykonuje warunkowe group by więc NULL sourceids nie będą grupowane. Następnie umieszcza je jako ostatnie, używając logiki w order by .

Nie rozumiałem, co masz na myśli przez ostatnie zdarzenie. Teraz myślę, że tak:

SELECT coalesce(s.id, mytable.id) as id,
       max(case when s.maxid is not null and s.maxid = myable.id then mytable.name
                when s.maxid is null then NULL
                else mytable.name
           end) as name,
       (To_days(date_expires)-TO_DAYS(NOW())) as dayDiff, COUNT(id) AS change_count
FROM mytable left outer join
     (select source_id, MAX(id) as maxid
      from mytable
      where source_id is not null
      group by source_id
     ) s
     on mytable.id = s.maxid
GROUP BY (case when source_id is null then id else source_id end)
HAVING dayDiff < 4 
ORDER BY (case when source_id is null then 1 else 0 end), date_created DESC

To łączy informacje z ostatniego rekordu (na podstawie najwyższego identyfikatora).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zapobieganie wstrzykiwaniu SQL

  2. Użycie select do zmiennej lokalnej i przygotowanej instrukcji w mysql

  3. Używanie parametrów w instrukcji sql, która zawiera format_daty

  4. Laravel przy użyciu klauzuli where w metodzie withCount

  5. mysql - po wstawieniu zignoruj ​​pobierz klucz podstawowy