如何在此查询中获取每一天的 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

我怎样才能得到这个,谢谢?

SQL FIDDLE DEMO HERE

您使用了 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

Demo here

您只需在查询中添加 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

然后 MAXMIN 命令只使用您日记中的值 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 中没有重复记录,它的两列 IdDiaryIdDay 是您需要额外信息的字段(最小和最大小时)。所以你所要做的就是将这些信息加入到 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;

坚持这种技巧有两个好处:

  1. 您在 select 中非常清楚地展示了您在做什么以及 table 之间的关系。
  2. 这适用于来自不同 table 的多个聚合。有些人,尤其是初学者,倾向于先加入所有 table,然后才考虑如何获取所需的数据。这可能会很麻烦。假设您有一个 table city、一个 table park 和一个 table lake。您想知道每个城市有多少个湖泊和公园面积的总和。如图所示,您将加入具有湖泊计数和公园面积总和的城市。相反,如果您首先加入所有 table,您将拥有实际上完全不相关的湖泊和公园的组合,并且很难或不可能以某种方式将所需的结果与这些数据分离。