Группировать по столбцам и строкам, подсчетам и процентам в день

Простой способ узнать, установлена ​​ли ваша ОС на SSD или нет, - это запустить команду из окна терминала с именем lsblk -o name,rota. Посмотрите на столбец ROTA на выходе, и там вы увидите цифры. A 0 означает отсутствие скорости вращения или привода SSD. A 1 будет указывать диск с пластинами, которые вращаются. Мой Ubuntu установлен на моем диске /dev/sdb, поэтому мы можем видеть, что один указывает на 0, что означает, что он установлен на SSD-диске. Я положил после этого примера того, как определить, где установлена ​​ваша ОС, с помощью df.

ПРИМЕЧАНИЕ. Ubuntu, установленный как клиент в любом цикле или виртуальных машинах, покажет ROTA 1 независимо от установки ОС хоста. Кроме того, «твердотельные гибридные приводы» и USB-флеш-накопители также показывают ROTA 1.

Пример:

terrance@terrance-ubuntu:~$ lsblk -o name,rota
NAME   ROTA
sda       1
└─sda1    1
sdb       0
├─sdb1    0
├─sdb2    0
└─sdb5    0
sdc       1
└─sdc1    1
sdd       1
└─sdd1    1
sde       0
├─sde1    0
└─sde2    0
sdf       1
└─sdf1    1
sdg       1
└─sdg1    1
sdh       1
└─sdh1    1
sr0       1
sr1       1

Или вы можете сделать проверку как один скрипт liner, используя -d, чтобы не показывать разделы:

lsblk -d -o name,rota | awk 'NR>1' | while read CC; do dd=$(echo $CC | awk '{print $2}'); if [ ${dd} -eq 0 ]; then echo $(echo $CC | awk '{print $1}') is a SSD drive; fi; done

Пример:

terrance@terrance-ubuntu:~$ lsblk -d -o name,rota | awk 'NR>1' | while read CC; do dd=$(echo $CC | awk '{print $2}'); if [ ${dd} -eq 0 ]; then echo $(echo $CC | awk '{print $1}') is a SSD drive; fi; done
sdb is a SSD drive
sde is a SSD drive

Чтобы определить, какой диск вашей установки включен, запустите команду df из окна терминала и посмотрите в столбце Mounted on, а один с / - это диск, на котором установлена ​​ваша ОС. В столбце FileSystem показано устройство или /dev/sdb1, связанное с /.

ПРИМЕЧАНИЕ: Диски, настроенные с LVM (Logical Volume Management), фактически показывают диск как /boot вместо /.

Пример:

terrance@terrance-ubuntu:~$ df
Filesystem      1K-blocks       Used  Available Use% Mounted on
udev              4032040          0    4032040   0% /dev
tmpfs              817508       9976     807532   2% /run
/dev/sdb1       222309012   38264268  172728984  19% /
tmpfs             4087520        352    4087168   1% /dev/shm
tmpfs                5120          4       5116   1% /run/lock
tmpfs             4087520          0    4087520   0% /sys/fs/cgroup
/dev/sdf1       244196348  182870888   61325460  75% /media/250GB_SHARE
/dev/sdc1       488385532  332540064  155845468  69% /media/WD500GB
/dev/sdh1       488385532  315052908  173332624  65% /media/320GB
/dev/sdg1       488384532  314763032  173621500  65% /media/500GB
/dev/sde2       233916412   20392712  213523700   9% /media/Windows
/dev/sdd1       976760828  216967888  759792940  23% /media/1TB_SHARE
/dev/sda1      2930253820 1004868460 1925385360  35% /media/Seagate
tmpfs              817508         36     817472   1% /run/user/1000

UPDATE: lsblk также может использоваться, чтобы показать, где ОС и если диск SSD все в одной команде:

lsblk -o NAME,MOUNTPOINT,MODEL,ROTA

Пример:

terrance@terrance-ubuntu:~$ lsblk -o NAME,MOUNTPOINT,MODEL,ROTA
NAME   MOUNTPOINT         MODEL            ROTA
sda                       Backup+ Desk        1
└─sda1 /media/Seagate                         1
sdb                       WDC WD2500JD-00K    1
└─sdb1 /media/250GB_SHARE                     1
sdc                       WDC WD5000AAKS-4    1
└─sdc1 /media/500GB                           1
sdd                       ST500DM002-1BC14    1
└─sdd1 /media/320GB                           1
sde                       SanDisk SDSSDA24    0
├─sde1 /                                      0
├─sde2                                        0
└─sde5 [SWAP]                                 0
sdf                       WDC WD5000AAKX-2    1
└─sdf1 /media/WD500GB                         1
sdg                       WDC WD10EZEX-00W    1
└─sdg1 /media/1TB_SHARE                       1
sdh                       SanDisk SDSSDA24    0
├─sdh1                                        0
└─sdh2 /media/Windows                         0
sr0                       BD-RE  BH16NS40     1
sr1                       DVD-RAM GH40L       1

Это после перезагрузки системы, поэтому мои обозначения дисков изменились снова, но, как вы можете видеть, мои диски SanDisk являются SSD, а ROTA показывает 0.

Надеюсь, что это поможет!

0
задан 13 August 2018 в 15:26

4 ответа

В принципе, я рассматриваю это как условную агрегацию. Но вам нужно получить перечислитель для даты поворота. Итак:

SELECT attr, 
       COUNT(*) FILTER (WHERE day_number = 1) as day1_count, 
       COUNT(*) FILTER (WHERE day_number = 1) / cnt as day1_percent, 
       COUNT(*) FILTER (WHERE day_number = 2) as day2_count,
       COUNT(*) FILTER (WHERE day_number = 2) / cnt as day2_percent
FROM (SELECT attr,
             DENSE_RANK() OVER (ORDER BY time::date DESC) as day_number,
             1.0 * COUNT(*) OVER (PARTITION BY attr) as cnt
      FROM test_table
     ) s
GROUP BY attr, cnt
ORDER BY attr;

Вот скрипт SQL.

0
ответ дан 15 August 2018 в 17:00

Приведем логику перед представлением:

with CTE1 as
(
select attr, DATEPART(day, time) as theday, count(*) as thecount
from MyTable
)
, CTE2 as
(
select theday, sum(thecount) as daytotal
from CTE1
group by theday
)
select t1.attr, t1.theday, t1.thecount, t1.thecount/t2.daytotal as percentofday
from CTE1 t1
inner join CTE2 t2
on t1.theday = t2.theday

Отсюда вы можете поворачиваться, чтобы создать день за днем, если вы почувствуете необходимость

0
ответ дан 15 August 2018 в 17:00

Если у вас есть только 2 дня:

http://sqlfiddle.com/#!17/3bdad/3 (дни спускаются, как в вашем примере слева направо)

http://sqlfiddle.com/#!17/3bdad/3 (дни по возрастанию)

Основная идея уже упоминается в других ответах. Вместо того, чтобы присоединяться к CTE для вычисления значений, я использую функции окна, которые немного короче и читабельны, я думаю.

 SELECT 
    attr, 
    COALESCE(max(count) FILTER (WHERE day_number = 0), 0) as day1_count,         -- D
    COALESCE(max(percent) FILTER (WHERE day_number = 0), 0) as day1_percent, 
    COALESCE(max(count) FILTER (WHERE day_number = 1), 0) as day2_count,
    COALESCE(max(percent) FILTER (WHERE day_number = 1), 0) as day2_percent
    /*
       Add more days here
    */
FROM(
    SELECT *, (count::float/count_per_day)::decimal(5, 2) as percent             -- C
    FROM (
        SELECT DISTINCT
            attr, 
            MAX(time::date) OVER () - time::date as day_number,                  -- B
            count(*) OVER (partition by time::date, attr) as count,              -- A
            count(*) OVER (partition by time::date) as count_per_day 
        FROM test_table
    )s
)s

GROUP BY attr
ORDER BY attr

Считывание строк в день и подсчет строк в день И attr

B для большей удобочитаемости. Я конвертирую дату в номера. Здесь я беру разницу между текущей датой строки и максимальной датой, доступной в таблице. Поэтому я получаю счетчик от 0 (первый день) до n - 1 (последний день)

C, вычисляющий процент и округление

D, поворачивая по фильтрам числа дней. [F3] избегает значений NULL и переключает их на 0. Чтобы добавить больше дней, вы можете умножить эти столбцы.

Изменить: сделал дневной счет более гибким в течение нескольких дней; новый SQL Fiddle

0
ответ дан 15 August 2018 в 17:00

Я пытаюсь улучшить запрос @johnHC btw, если вам нужно в течение 7 дней, то у вас есть те дни, когда

with CTE1 as
(
select attr, time::date as theday, count(*) as thecount
from t group by attr,time::date
)
, CTE2 as
(
select theday, sum(thecount) as daytotal
from CTE1
group by theday
)
,
CTE3 as
(
select t1.attr, EXTRACT(DOW FROM  t1.theday) as day_nmbr,t1.theday, t1.thecount, t1.thecount/t2.daytotal as percentofday
from CTE1 t1
inner join CTE2 t2
on t1.theday = t2.theday
) 
select CTE3.attr,
max(case when day_nmbr=0 then CTE3.thecount end) as day1Cnt,
max(case when day_nmbr=0 then percentofday end) as day1,
max(case when day_nmbr=1 then CTE3.thecount end) as day2Cnt,
max( case when day_nmbr=1 then percentofday end) day2 
from  CTE3 group by CTE3.attr

http://sqlfiddle.com/#!17/54ace / 20

0
ответ дан 15 August 2018 в 17:00

Другие вопросы по тегам:

Похожие вопросы: