扩展统计 mysql 和 tcl
extension statistic mysql and tcl
我问了一个问题并从@O 那里得到了很好的解决方案。琼斯,非常感谢。
不幸的是,我不得不用一个专栏 building
来扩展 mysql 数据库
我现在还需要,给每个,楼,最benutt取名字
举个例子,在work1,A1是使用最多的建筑,at work2是B1
ID key ctime name floor floorid door building
1 114554737 1609613062 work1 1 D1 112 A1
2 114554737 1609662335 work1 1 D1 112 A1
3 114554737 1609662388 work1 1 D1 115 A2
4 114554737 1609665480 work1 2 D1 201 C1
5 114554738 1609701179 work2 2 D1 202 A1
6 114554738 1609701188 work2 1 D1 101 B1
7 114554738 1609701195 work2 2 D1 225 B1
8 114554738 1609701253 work2 3 D1 318 B1
9 114554738 1609707953 work2 4 D1 412 C1
10 114554738 1609876824 work2 5 D1 500 C1
11 114554739 1609956064 work3 1 D1 100 C1
12 114554739 1609956067 work3 1 D1 101 A1
13 114554739 1610084925 work3 1 D1 100 A1
14 114554739 1610084928 work3 1 D1 100 A1
15 114554740 1610141106 work4 2 D1 201 A1
16 114554740 1610141109 work4 2 D1 202 A1
17 114554740 1610177322 work4 2 D1 202 A1
18 114554740 1610178412 work4 2 D1 202 A1
19 114554740 1610207104 work4 2 D1 202 A1
20 114554741 1610216851 work5 2 D1 202 A1
21 114554741 1610268582 work5 2 D1 202 A1
22 114554741 1610268908 work5 2 D1 202 A1
23 114554741 1610271923 work5 2 D1 206 A1
24 114554741 1610275117 work5 2 D1 206 A1
25 114554741 1610293137 work5 3 D1 301 A1
我使用 O. Jone 的回答中的这个查询
set sql {SELECT t.name, t.total, d.details
FROM (SELECT COUNT(*) total, name FROM stats GROUP BY name) t
JOIN ( SELECT name,
GROUP_CONCAT(CONCAT(bydoor,'X',' door ', door) ORDER BY bydoor DESC) details
FROM ( SELECT COUNT(*) bydoor,
name,
door
FROM stats
GROUP BY name, door
) s
GROUP BY name
) d ON t.name = d.name
ORDER BY t.total DESC, t.name}
对象计数的一个问题是,如果有两个建筑物的计数相同怎么办。
我更改了数据来演示问题。
GORUP_CONCAT
也可以按任何可用的列排序
例如GROUP_CONCAT(
建筑ORDER BY
建筑) AS
建筑``
CREATE TABLE stats (
`ID` INTEGER,
`key` INTEGER,
`ctime` INTEGER,
`name` VARCHAR(5),
`floor` INTEGER,
`floorid` VARCHAR(2),
`door` INTEGER,
`building` VARCHAR(2)
);
INSERT INTO stats
(`ID`, `key`, `ctime`, `name`, `floor`, `floorid`, `door`, `building`)
VALUES
('1', '114554737', '1609613062', 'work1', '1', 'D1', '112', 'A1'),
('2', '114554737', '1609662335', 'work1', '1', 'D1', '112', 'A1'),
('3', '114554737', '1609662388', 'work1', '1', 'D1', '115', 'A2'),
('3', '114554737', '1609662388', 'work1', '1', 'D1', '115', 'A2'),
('4', '114554737', '1609665480', 'work1', '2', 'D1', '201', 'C1'),
('5', '114554738', '1609701179', 'work2', '2', 'D1', '202', 'A1'),
('6', '114554738', '1609701188', 'work2', '1', 'D1', '101', 'B1'),
('7', '114554738', '1609701195', 'work2', '2', 'D1', '225', 'B1'),
('8', '114554738', '1609701253', 'work2', '3', 'D1', '318', 'B1'),
('9', '114554738', '1609707953', 'work2', '4', 'D1', '412', 'C1'),
('10', '114554738', '1609876824', 'work2', '5', 'D1', '500', 'C1'),
('11', '114554739', '1609956064', 'work3', '1', 'D1', '100', 'C1'),
('12', '114554739', '1609956067', 'work3', '1', 'D1', '101', 'A1'),
('13', '114554739', '1610084925', 'work3', '1', 'D1', '100', 'A1'),
('14', '114554739', '1610084928', 'work3', '1', 'D1', '100', 'A1'),
('15', '114554740', '1610141106', 'work4', '2', 'D1', '201', 'A1'),
('16', '114554740', '1610141109', 'work4', '2', 'D1', '202', 'A1'),
('17', '114554740', '1610177322', 'work4', '2', 'D1', '202', 'A1'),
('18', '114554740', '1610178412', 'work4', '2', 'D1', '202', 'A1'),
('19', '114554740', '1610207104', 'work4', '2', 'D1', '202', 'A1'),
('20', '114554741', '1610216851', 'work5', '2', 'D1', '202', 'A1'),
('21', '114554741', '1610268582', 'work5', '2', 'D1', '202', 'A1'),
('22', '114554741', '1610268908', 'work5', '2', 'D1', '202', 'A1'),
('23', '114554741', '1610271923', 'work5', '2', 'D1', '206', 'A1'),
('24', '114554741', '1610275117', 'work5', '2', 'D1', '206', 'A1'),
('25', '114554741', '1610293137', 'work5', '3', 'D1', '301', 'A1');
SELECT
t.name, t.total, d.details, t1.`building`
FROM
(SELECT
COUNT(*) total, name
FROM
stats
GROUP BY name) t
JOIN
(SELECT
name,
GROUP_CONCAT(CONCAT(bydoor, 'X', ' door ', door)
ORDER BY bydoor DESC) details
FROM
(SELECT
COUNT(*) bydoor, name, door
FROM
stats
GROUP BY name , door) s
GROUP BY name) d ON t.name = d.name
INNER JOIN
(SELECT
`name`,
GROUP_CONCAT(`building`) AS `building`,
buildingcount
FROM
(SELECT
`name`, `building`, COUNT(`building`) buildingcount
FROM
stats s
GROUP BY name , `building`
HAVING buildingcount = (SELECT
COUNT(`building`)
FROM
stats
WHERE
`name` = s.`name`
GROUP BY name , `building`
ORDER BY COUNT(`building`) DESC
LIMIT 1)) t3
GROUP BY `name` , buildingcount) t1 ON t1.`name` = t.`name`
ORDER BY t.total DESC , t.name
name | total | details | building
:---- | ----: | :---------------------------------------------------------------------- | :-------
work2 | 6 | 1X door 500,1X door 412,1X door 318,1X door 225,1X door 202,1X door 101 | B1
work5 | 6 | 3X door 202,2X door 206,1X door 301 | A1
work1 | 5 | 2X door 115,2X door 112,1X door 201 | A2,A1
work4 | 5 | 4X door 202,1X door 201 | A1
work3 | 4 | 3X door 100,1X door 101 | A1
SELECT `name`,GROUP_CONCAT(`building`), buildingcount
FROM
(SELECT `name`, `building`,COUNT(`building`) buildingcount
FROM stats s
GROUP BY name,`building`
HAVING buildingcount = (SELECT COUNT(`building`) FROM stats WHERE `name` = s.`name`
GROUP BY name,`building`
ORDER BY COUNT(`building`) DESC LIMIT 1)) t3
GROUP BY `name`, buildingcount
name | GROUP_CONCAT(`building`) | buildingcount
:---- | :----------------------- | ------------:
work1 | A1,A2 | 2
work2 | B1 | 3
work3 | A1 | 3
work4 | A1 | 5
work5 | A1 | 6
db<>fiddle here
我问了一个问题并从@O 那里得到了很好的解决方案。琼斯,非常感谢。
不幸的是,我不得不用一个专栏 building
来扩展 mysql 数据库我现在还需要,给每个,楼,最benutt取名字
举个例子,在work1,A1是使用最多的建筑,at work2是B1
ID key ctime name floor floorid door building
1 114554737 1609613062 work1 1 D1 112 A1
2 114554737 1609662335 work1 1 D1 112 A1
3 114554737 1609662388 work1 1 D1 115 A2
4 114554737 1609665480 work1 2 D1 201 C1
5 114554738 1609701179 work2 2 D1 202 A1
6 114554738 1609701188 work2 1 D1 101 B1
7 114554738 1609701195 work2 2 D1 225 B1
8 114554738 1609701253 work2 3 D1 318 B1
9 114554738 1609707953 work2 4 D1 412 C1
10 114554738 1609876824 work2 5 D1 500 C1
11 114554739 1609956064 work3 1 D1 100 C1
12 114554739 1609956067 work3 1 D1 101 A1
13 114554739 1610084925 work3 1 D1 100 A1
14 114554739 1610084928 work3 1 D1 100 A1
15 114554740 1610141106 work4 2 D1 201 A1
16 114554740 1610141109 work4 2 D1 202 A1
17 114554740 1610177322 work4 2 D1 202 A1
18 114554740 1610178412 work4 2 D1 202 A1
19 114554740 1610207104 work4 2 D1 202 A1
20 114554741 1610216851 work5 2 D1 202 A1
21 114554741 1610268582 work5 2 D1 202 A1
22 114554741 1610268908 work5 2 D1 202 A1
23 114554741 1610271923 work5 2 D1 206 A1
24 114554741 1610275117 work5 2 D1 206 A1
25 114554741 1610293137 work5 3 D1 301 A1
我使用 O. Jone 的回答中的这个查询
set sql {SELECT t.name, t.total, d.details
FROM (SELECT COUNT(*) total, name FROM stats GROUP BY name) t
JOIN ( SELECT name,
GROUP_CONCAT(CONCAT(bydoor,'X',' door ', door) ORDER BY bydoor DESC) details
FROM ( SELECT COUNT(*) bydoor,
name,
door
FROM stats
GROUP BY name, door
) s
GROUP BY name
) d ON t.name = d.name
ORDER BY t.total DESC, t.name}
对象计数的一个问题是,如果有两个建筑物的计数相同怎么办。
我更改了数据来演示问题。
GORUP_CONCAT
也可以按任何可用的列排序
例如GROUP_CONCAT(
建筑ORDER BY
建筑) AS
建筑``
CREATE TABLE stats ( `ID` INTEGER, `key` INTEGER, `ctime` INTEGER, `name` VARCHAR(5), `floor` INTEGER, `floorid` VARCHAR(2), `door` INTEGER, `building` VARCHAR(2) ); INSERT INTO stats (`ID`, `key`, `ctime`, `name`, `floor`, `floorid`, `door`, `building`) VALUES ('1', '114554737', '1609613062', 'work1', '1', 'D1', '112', 'A1'), ('2', '114554737', '1609662335', 'work1', '1', 'D1', '112', 'A1'), ('3', '114554737', '1609662388', 'work1', '1', 'D1', '115', 'A2'), ('3', '114554737', '1609662388', 'work1', '1', 'D1', '115', 'A2'), ('4', '114554737', '1609665480', 'work1', '2', 'D1', '201', 'C1'), ('5', '114554738', '1609701179', 'work2', '2', 'D1', '202', 'A1'), ('6', '114554738', '1609701188', 'work2', '1', 'D1', '101', 'B1'), ('7', '114554738', '1609701195', 'work2', '2', 'D1', '225', 'B1'), ('8', '114554738', '1609701253', 'work2', '3', 'D1', '318', 'B1'), ('9', '114554738', '1609707953', 'work2', '4', 'D1', '412', 'C1'), ('10', '114554738', '1609876824', 'work2', '5', 'D1', '500', 'C1'), ('11', '114554739', '1609956064', 'work3', '1', 'D1', '100', 'C1'), ('12', '114554739', '1609956067', 'work3', '1', 'D1', '101', 'A1'), ('13', '114554739', '1610084925', 'work3', '1', 'D1', '100', 'A1'), ('14', '114554739', '1610084928', 'work3', '1', 'D1', '100', 'A1'), ('15', '114554740', '1610141106', 'work4', '2', 'D1', '201', 'A1'), ('16', '114554740', '1610141109', 'work4', '2', 'D1', '202', 'A1'), ('17', '114554740', '1610177322', 'work4', '2', 'D1', '202', 'A1'), ('18', '114554740', '1610178412', 'work4', '2', 'D1', '202', 'A1'), ('19', '114554740', '1610207104', 'work4', '2', 'D1', '202', 'A1'), ('20', '114554741', '1610216851', 'work5', '2', 'D1', '202', 'A1'), ('21', '114554741', '1610268582', 'work5', '2', 'D1', '202', 'A1'), ('22', '114554741', '1610268908', 'work5', '2', 'D1', '202', 'A1'), ('23', '114554741', '1610271923', 'work5', '2', 'D1', '206', 'A1'), ('24', '114554741', '1610275117', 'work5', '2', 'D1', '206', 'A1'), ('25', '114554741', '1610293137', 'work5', '3', 'D1', '301', 'A1');
SELECT t.name, t.total, d.details, t1.`building` FROM (SELECT COUNT(*) total, name FROM stats GROUP BY name) t JOIN (SELECT name, GROUP_CONCAT(CONCAT(bydoor, 'X', ' door ', door) ORDER BY bydoor DESC) details FROM (SELECT COUNT(*) bydoor, name, door FROM stats GROUP BY name , door) s GROUP BY name) d ON t.name = d.name INNER JOIN (SELECT `name`, GROUP_CONCAT(`building`) AS `building`, buildingcount FROM (SELECT `name`, `building`, COUNT(`building`) buildingcount FROM stats s GROUP BY name , `building` HAVING buildingcount = (SELECT COUNT(`building`) FROM stats WHERE `name` = s.`name` GROUP BY name , `building` ORDER BY COUNT(`building`) DESC LIMIT 1)) t3 GROUP BY `name` , buildingcount) t1 ON t1.`name` = t.`name` ORDER BY t.total DESC , t.name
name | total | details | building :---- | ----: | :---------------------------------------------------------------------- | :------- work2 | 6 | 1X door 500,1X door 412,1X door 318,1X door 225,1X door 202,1X door 101 | B1 work5 | 6 | 3X door 202,2X door 206,1X door 301 | A1 work1 | 5 | 2X door 115,2X door 112,1X door 201 | A2,A1 work4 | 5 | 4X door 202,1X door 201 | A1 work3 | 4 | 3X door 100,1X door 101 | A1
SELECT `name`,GROUP_CONCAT(`building`), buildingcount FROM (SELECT `name`, `building`,COUNT(`building`) buildingcount FROM stats s GROUP BY name,`building` HAVING buildingcount = (SELECT COUNT(`building`) FROM stats WHERE `name` = s.`name` GROUP BY name,`building` ORDER BY COUNT(`building`) DESC LIMIT 1)) t3 GROUP BY `name`, buildingcount
name | GROUP_CONCAT(`building`) | buildingcount :---- | :----------------------- | ------------: work1 | A1,A2 | 2 work2 | B1 | 3 work3 | A1 | 3 work4 | A1 | 5 work5 | A1 | 6
db<>fiddle here