Простой способ узнать, установлена ли ваша ОС на 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.
Надеюсь, что это поможет!
В принципе, я рассматриваю это как условную агрегацию. Но вам нужно получить перечислитель для даты поворота. Итак:
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.
Приведем логику перед представлением:
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
Отсюда вы можете поворачиваться, чтобы создать день за днем, если вы почувствуете необходимость
Если у вас есть только 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
Я пытаюсь улучшить запрос @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