如何在此查询中获取每一天的 MAX(Hour) 和 The MIN(Hour)?
How to get the MAX(Hour) and The MIN(Hour) for each day in this query?
我有这样的table日记结构:
CREATE TABLE Diary
(
[IdDiary] bigint,
[IdDay] numeric(18,0)
);
INSERT INTO Diary ([IdDiary], [IdDay])
values
(51, 1),
(52, 2),
(53, 5);
还有 table DiaryTimetable 的其他结构:
CREATE TABLE DiaryTimetable
(
[IdDiary] bigint,
[Hour] varchar(50)
);
INSERT INTO DiaryTimetable ([IdDiary], [Hour])
VALUES
(51, '09:00'),
(51, '09:30'),
(51, '10:00'),
(51, '10:30'),
(51, '11:00'),
(51, '11:30'),
(52, '11:00'),
(52, '11:30'),
(52, '12:00'),
(52, '12:30'),
(52, '13:00'),
(52, '13:30'),
(53, '15:00'),
(53, '15:30'),
(53, '16:00'),
(53, '16:30');
table日记包含一个IdDiary,IdDay是天数,例如:
Monday --> 1
Tuesday --> 2
Wednesday --> 3
Thursday --> 4
Friday --> 5
Saturday --> 6
Sunday --> 7
table DiaryTimetable 包含日记和小时。
我想获得日记 table 中每天出现的 table DiaryTimetable 中的最大小时数和最小小时数,如果我输入此查询,结果将仅为最大小时数所有查询的小时和最小小时:
select MAX(Hour), MIN(Hour) from DiaryTimetable
inner join Diary on
DiaryTimetable.IdDiary = Diary.IdDiary
我需要的 wat 结果应该是这样的:
IdDiary IdDay Min Hour Max Hour
----- ----- -------- ---------
51 1 09:00 11:30
52 2 11:00 13:30
53 5 15:00 16:30
我怎样才能得到这个,谢谢?
您使用了 GROUP BY
子句:
SELECT d.IdDiary, d.IdDay, MIN(Hour), MAX(Hour)
FROM Diary AS d
LEFT JOIN DiaryTimetable AS dt ON d.IdDiary = dt.IdDiary
GROUP BY d.IdDiary, d.IdDay
您只需在查询中添加 GROUP BY
:
SELECT Diary.IdDiary, Diary.IdDay, MAX(DT.Hour), MIN(DT.Hour)
FROM DiaryTimetable AS DT
INNER JOIN Diary ON
DT.IdDiary = Diary.IdDiary
GROUP BY Diary.IdDiary, Diary.IdDay
然后 MAX
和 MIN
命令只使用您日记中的值 Table。
您刚刚在查询中遗漏了 Group by
。
SELECT b.IdDiary,a.IdDay, MIN(b.Hour), MAX(b.hour)
from Diary A INNER JOIN DiaryTimetable B ON A.IdDiary=B.IdDiary
GROUP by B.IdDiary ,a.IdDay
如评论中所说,这只是供您学习的示例,我想补充一个答案。
鉴于 Diary
中没有重复记录,它的两列 IdDiary
和 IdDay
是您需要额外信息的字段(最小和最大小时)。所以你所要做的就是将这些信息加入到 table:
select
d.iddiary,
d.idday,
dt.min_hour,
dt.max_hour
from diary d
join
(
select
iddiary,
min(hour) as min_hour,
max(hour) as max_hour
from diarytimetable
group by iddiary
) dt on dt.iddiary = d.iddiary;
坚持这种技巧有两个好处:
- 您在 select 中非常清楚地展示了您在做什么以及 table 之间的关系。
- 这适用于来自不同 table 的多个聚合。有些人,尤其是初学者,倾向于先加入所有 table,然后才考虑如何获取所需的数据。这可能会很麻烦。假设您有一个 table
city
、一个 table park
和一个 table lake
。您想知道每个城市有多少个湖泊和公园面积的总和。如图所示,您将加入具有湖泊计数和公园面积总和的城市。相反,如果您首先加入所有 table,您将拥有实际上完全不相关的湖泊和公园的组合,并且很难或不可能以某种方式将所需的结果与这些数据分离。
我有这样的table日记结构:
CREATE TABLE Diary
(
[IdDiary] bigint,
[IdDay] numeric(18,0)
);
INSERT INTO Diary ([IdDiary], [IdDay])
values
(51, 1),
(52, 2),
(53, 5);
还有 table DiaryTimetable 的其他结构:
CREATE TABLE DiaryTimetable
(
[IdDiary] bigint,
[Hour] varchar(50)
);
INSERT INTO DiaryTimetable ([IdDiary], [Hour])
VALUES
(51, '09:00'),
(51, '09:30'),
(51, '10:00'),
(51, '10:30'),
(51, '11:00'),
(51, '11:30'),
(52, '11:00'),
(52, '11:30'),
(52, '12:00'),
(52, '12:30'),
(52, '13:00'),
(52, '13:30'),
(53, '15:00'),
(53, '15:30'),
(53, '16:00'),
(53, '16:30');
table日记包含一个IdDiary,IdDay是天数,例如:
Monday --> 1
Tuesday --> 2
Wednesday --> 3
Thursday --> 4
Friday --> 5
Saturday --> 6
Sunday --> 7
table DiaryTimetable 包含日记和小时。 我想获得日记 table 中每天出现的 table DiaryTimetable 中的最大小时数和最小小时数,如果我输入此查询,结果将仅为最大小时数所有查询的小时和最小小时:
select MAX(Hour), MIN(Hour) from DiaryTimetable
inner join Diary on
DiaryTimetable.IdDiary = Diary.IdDiary
我需要的 wat 结果应该是这样的:
IdDiary IdDay Min Hour Max Hour
----- ----- -------- ---------
51 1 09:00 11:30
52 2 11:00 13:30
53 5 15:00 16:30
我怎样才能得到这个,谢谢?
您使用了 GROUP BY
子句:
SELECT d.IdDiary, d.IdDay, MIN(Hour), MAX(Hour)
FROM Diary AS d
LEFT JOIN DiaryTimetable AS dt ON d.IdDiary = dt.IdDiary
GROUP BY d.IdDiary, d.IdDay
您只需在查询中添加 GROUP BY
:
SELECT Diary.IdDiary, Diary.IdDay, MAX(DT.Hour), MIN(DT.Hour)
FROM DiaryTimetable AS DT
INNER JOIN Diary ON
DT.IdDiary = Diary.IdDiary
GROUP BY Diary.IdDiary, Diary.IdDay
然后 MAX
和 MIN
命令只使用您日记中的值 Table。
您刚刚在查询中遗漏了 Group by
。
SELECT b.IdDiary,a.IdDay, MIN(b.Hour), MAX(b.hour)
from Diary A INNER JOIN DiaryTimetable B ON A.IdDiary=B.IdDiary
GROUP by B.IdDiary ,a.IdDay
如评论中所说,这只是供您学习的示例,我想补充一个答案。
鉴于 Diary
中没有重复记录,它的两列 IdDiary
和 IdDay
是您需要额外信息的字段(最小和最大小时)。所以你所要做的就是将这些信息加入到 table:
select
d.iddiary,
d.idday,
dt.min_hour,
dt.max_hour
from diary d
join
(
select
iddiary,
min(hour) as min_hour,
max(hour) as max_hour
from diarytimetable
group by iddiary
) dt on dt.iddiary = d.iddiary;
坚持这种技巧有两个好处:
- 您在 select 中非常清楚地展示了您在做什么以及 table 之间的关系。
- 这适用于来自不同 table 的多个聚合。有些人,尤其是初学者,倾向于先加入所有 table,然后才考虑如何获取所需的数据。这可能会很麻烦。假设您有一个 table
city
、一个 tablepark
和一个 tablelake
。您想知道每个城市有多少个湖泊和公园面积的总和。如图所示,您将加入具有湖泊计数和公园面积总和的城市。相反,如果您首先加入所有 table,您将拥有实际上完全不相关的湖泊和公园的组合,并且很难或不可能以某种方式将所需的结果与这些数据分离。